快速排序
首先简单描述一下快速排序的过程。
比如有一组数据:
第一步以6为基数,我们要筛选出,比6大的数字,放在6的后面,比6小的数字,放在6的前面。所以需要两个指针(下标)。
从y开始,由于【2 < 6】,所以需要用2来覆盖6(不用担心6被覆盖,6已经被记下来了)。同时x++。
接下来从x开始。由于【4 < 6】,就应该放在左边,所以不要移动元素4。继续x++。由于【7 > 6】,所以把7放在y对应的位置。同时y–。
再次回到y这边。【9 > 6】,不需要交换。y–。【1 < 6】,把1放在x所指的位置,同时x++。
再回到x这边。【3 < 6】,不需要调整位置。x++。【8 > 6】,把元素8放在y所指位置,同时y–。
此时x、y相等,把6放在x或者y所指位置,第一步结束。可以发现,6的前面都是比6小的数字,6的后面都是比6大的数字。
对6前面的数组、6后面的数组,进行同样的操作。所以代码中需要递归进行。
代码
#include <stdio.h>
void QuickSort(int *a, int start, int end)
{
if (start >= end)
{
return;
}
int x = start;
int y = end;
int base = a[start];
while (x < y)
{
while (a[y] > base && x < y)
{
y--;
}
if (x < y)
{
a[x++] = a[y];
}
while (a[x] < base && x < y)
{
x++;
}
if (x < y)
{
a[y--] = a[x];
}
}
a[x] = base;
QuickSort(a, start, x - 1);
QuickSort(a, x + 1, end);
}
int main()
{
int i;
int array[10] = {9, 3, 4, 4, 6, 0, 1, 3, 8, 5};
QuickSort(array, 0, sizeof(array) / sizeof(array[0]) - 1);
for (i = 0; i < sizeof(array) / sizeof(array[0]); i++)
{
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
更多视频、文章、嵌入式学习资源,微信关注 【学益得智能硬件】