快速排序算法是最早由圖靈獎獲得者Tony Hoare設計出來的,他在形式化方法理論的發明中都有卓越的貢獻,是上世紀最偉大的計算機科學家之一。而這個快速排序算法只是他衆多貢獻中的一個小發明而已。更值得一提的是,我們現在學習的這個快速排序算法,被列爲20世紀十大算法之一。
快速排序其實就是我們前面認爲最慢的冒泡排序的升級,它們都屬於交換類排序。即它是通過不斷比較和移動交換來實現
排序的,只不過它的實現,增大了記錄的比較和移動的距離,將關鍵字較大的記錄從前面直接移動到後面,關鍵字較小的從後面移動到前面
,從而減少了總的比較次數和移動交換次數。
其基本思想是:
1.選擇一個基準值,我們設最右邊的一個作爲基準值;
2.遍歷整個區間,把所有的數與基準值作比較並進行數據移動,使得:
1).比基準值小的數放在基準值的左邊;
2).比基準值大的數放在基準值的右邊;
3.分治算法:[left, right] —> [left, div-1] ∪ [div+1, right],並利用遞歸的思路,遞歸的終止條件爲size = 0 或 size = 1 (區間裏沒有數或者區間裏已經有序)。
實現代碼如下:
#include <stdio.h>
#include <stdlib.h>
void Swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int Partition(int* arr, int left, int right)
{
int begin = left;
int end = right;
while (begin < end)
{
while (begin < end && arr[begin] <= arr[right])
{
begin++;
}
while (begin < end && arr[end] >= arr[right])
{
end--;
}
Swap(arr + begin, arr + end);
}
Swap(arr + begin, arr + right);
return begin;
}
void _QuickSort(int* arr, int left, int right)
{
if (left == right)
{
//若區間裏只剩一個數了
return;
}
if (left > right)
{
//區間裏沒有數了
return;
}
int div = Partition(arr, left, right);
_QuickSort(arr, left, div - 1);
_QuickSort(arr, div + 1, right);
}
void QuickSort(int* arr, int size)
{
_QuickSort(arr, 0, size - 1);
}
void Print(int* arr, int size)
{
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = { 50, 10, 90, 30, 70, 40, 80, 60, 20 };
int size = sizeof(arr) / sizeof(arr[0]);
printf("----------測試快速排序----------\n");
printf("排序之前爲: ");
Print(arr, size);
QuickSort(arr, size);
printf("排序之後爲: ");
Print(arr, size);
system("pause");
return 0;
}
運行結果: