在陀螺仪原始数据滤波时,需要用到排序算法去除最大最小值,首先想到的就是冒泡排序,但是由于冒泡排序时间复杂度高,所以就学习了一下更为高效的快速排序,在此记录,聊胜于无。
关键点:
1、找到基准元素对应的正确顺序位置
2、以这个位置前后进行递归
找到基准元素对应的正确顺序位置
- 假设一个数组为[15,3,2,45,99],一般来说都以数组的第一个元素为基准元素 所以基准元素:val = 15;
- 队尾指针:先从数组末尾开始往前搜索,大于等于基准元素的不管,继续往前,如果小于基准元素,就把这个值直接给到队首指针当前指向位置。
- 队首指针:然后从数组开头向后搜索,小于等于基准元素的不管,继续往后,如果大于基准元素,就直接把这个值给到首指针当前指向位置。
- 直到两个指针指向同一个位置,这个位置就是基准元素正确顺序所在位置。
绿色:基准元素位置
粉色:队首指针位置
蓝色:队尾指针位置
灰色:两指针重叠位置
黄色:基准元素正确位置
C语言算法实现:
/************************************************
@ 函数:找到基准元素的正确位置,并将基准元素放到正确位置上
@ 入口参数:
a:数组名称
low:队首指针位置,也就是从哪里开始排序
high:与上同义
@ 返回值:基准元素位置
************************************************/
float FindPos(float* a,int low,int high)
{
float val = a[low]; //将数组第一个元数作为基准元素
while(low < high)
{
while(low < high && a[high] >= a[low])
high--;
a[low] = a[high];
while(low < high && a[low] <= a[high])
low++;
a[high] = a[low];
}
a[low] = val;
return low;
}
/************************************************
@ 函数:快速排序数组
@ 入口参数:
a:数组名称
low:队首指针位置,也就是从哪里开始排序
high:与上同义
@ 返回值:基准元素位置
************************************************/
void QuickSort(float* a,int low,int high)
{
int pos;
if(low < high)
{
pos = FindPos(a,low,high);
QuickSort(a,low,pos-1);
QuickSort(a,pos+1,high);
}
}