快速排序
首先簡單描述一下快速排序的過程。
比如有一組數據:
第一步以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;
}
更多視頻、文章、嵌入式學習資源,微信關注 【學益得智能硬件】