[轉載] 《算法導論》
1、快速排序的思想
通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
2、快速排序的實現
void swap(int *data1, int *data2)
{
int tmp;
tmp = *data1;
*data1 = *data2;
*data2 = tmp;
}
void QuickSort(int *array,int length)
{
if (array == NULL || length < 2)
return;
int indexSmall = -1; //從前往後尋找
int index=0;
while (index < length-1)
{
if (array[index] < array[length - 1]) //參考元素選最後一個
{
indexSmall++;
if (indexSmall != index)
swap(array + indexSmall, array + index);
}
index++;
}
indexSmall++;
swap(array + indexSmall, array + length - 1);
QuickSort(array, indexSmall);
QuickSort(array + indexSmall + 1, length - indexSmall - 1);
}
2、快速排序的性能
1)、時間複雜度
快速排序的時間主要耗費在劃分操作上,對長度爲k的區間進行劃分,共需k-1次關鍵字的比較。
最壞情況是O(n^2)。當每次劃分選取的基準都是當前無序區中關鍵字最小(或最大)的記錄,劃分的結果是基準左邊的子區間爲空(或右邊的子區間爲空),而劃分所得的另一個非空的子區間中記錄數目,僅僅比劃分前的無序區中記錄個數減少一個。
最好情況下O(nlgn)。當每次劃分所取的基準都是當前無序區的”中值”記錄,劃分的結果是基準的左、右兩個無序子區間的長度大致相等。總的關鍵字比較次數:
它的平均時間複雜度爲O(nlgn)。儘管快速排序的最壞時間爲O(n^2),但就平均性能而言,它是基於關鍵字比較的內部排序算法中速度最快者,快速排序亦因此而得名。
2)、穩定性
快速排序是不穩定的。
和其它層算法的比較:
快速排序和冒泡排序都是基於比較的排序。