排序算法(4)——快速排序

[轉載] 《算法導論》

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)、穩定性
快速排序是不穩定的。

和其它層算法的比較:
快速排序和冒泡排序都是基於比較的排序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章