快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
基本思想
①先從數列中取出一個數作爲基準數;
②分區過程,將比這個數大的數全部放到它的右邊,小於等於它的數放到它的左邊;
③再次對左右區間重複步驟②,直到各個區域僅一個有數;
似乎理解起來不太容易爲什麼最後會是有序的?
假設有如下一個無序的數組排列
簡稱挖坑填數
①這裏選取基準數有很多種選法,我們就以選取第一個數據元素做爲基準數,先把這個“蘿蔔”出來找個箱子裝起來,並設置搜索的左右邊界L和R。
②從R處起,從右向左找到第一個比基準數小的“蘿蔔”,如果此時R>L,則放到基準數的坑處,L++;
③從L起,從左向左找到第一個比基準數大的,如果此時R>L,則放到剛纔取出“蘿蔔”的坑處,並R–;
若此時L小於R則,繼續重複上述步驟②和步驟③;
否則對左右部分分別遞歸,直到左右部分都只有一個數。
#include <iostream>
using namespace std;
int main()
{
void quick_sort(int s[], int l, int r);
int a[10] = { 1, 8, 7, 5, 4, 3, 6, 7, 10, 8 };
for (int i = 0; i < 10; i++)
{
cout << a[i] << ' ';
}
cout << endl;
quick_sort(a, 0, 9);
for (int j = 0; j < 10; j++)
{
cout << a[j] << ' ';
}
cout << endl;
cin.get();
return 0;
}
void quick_sort(int s[], int l, int r)
{
if (l<r)
{
int i = l, j = r, x = s[l]; //x的取值有不同取法
while (i<j)
{
while (i<j&&s[j]>x)
j--;
if (i<j)
{
s[i++] = s[j];
}
while (i < j&&s[i] < x) //從左向右找第一個大於等於x的數
i++;
if (i<j)
{
s[j--] = s[i];
}
s[i] = x;
}
quick_sort(s, l, i - 1);
quick_sort(s, i + 1, r);
}
}
運行結果