Sort排序專題(5)快速排序(QuickSort)(C++實現)

Hrbust-cxs發表於2020-11-06

快速排序(QuickSort)

快速排序:快速排序(Quicksort)是對氣泡排序的一種改進。
思想:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

圖解如下:
QuickSort
①以陣列第一個元素49作為參考,比他大的放到他的右邊,比他小的放到他的左邊。
②分別對其左右兩邊依次進行①的操作,進行遞迴。
③重複迴圈進行①②操作。

程式碼實現

#include<bits/stdc++.h>
using namespace std;

void QuickSort(int *arr,int l,int r)
{
    if(arr == NULL || l >= r)  return ;
    int lid = l,rid = r,Tmp;
    while(lid < rid)                                       //選出arr[l]作為標準參考元素
    {
        while(lid < rid && arr[rid] >= arr[l]) rid--;     //從右往左找第一個比參考元素小的值位置
        while(lid < rid && arr[lid] <= arr[l]) lid++;     //從左往右找第一個比參考元素大的值的位置
        Tmp = arr[lid];                     //交換arr[lid]和arr[rid],交換上面找到的兩個元素的位置
        arr[lid] = arr[rid];                //當使用異或進行值的交換時候必須保證兩個數不為同一個數。
        arr[rid] = Tmp;
    }
    Tmp = arr[lid];                         //交換arr[l]和arr[lid]位置,交換參考元素和交換後的lid位置
    arr[lid] = arr[l];                      //交換完了就實現了參考元素左邊都是小於其值,右邊都是大於其值的
    arr[l] = Tmp;
    QuickSort(arr,l,lid-1);                 //遞迴實現參考元素左邊的有序化
    QuickSort(arr,lid+1,r);                 //遞迴實現參考元素右邊的有序化
}

int main()
{
    int *arr = NULL;                  //指標==陣列  指標需要初始化
    int n,len;
    cin>>n;
    arr = (int*)malloc(sizeof(int)*n);   //指標使用需要malloc空間(malloc空間虛擬地址連續,實體地址不一定連續)
    for(int i = 0; i < n; i++)
    {
        cin>>arr[i];
    }
    QuickSort(arr,0,n-1);
    for(int i = 0; i < n; i++)
    {
        cout<<arr[i]<<" ";
    }
    free(arr);
    arr = 0;
    return 0;
}


時間複雜度

快速排序的一次劃分演算法從兩頭交替搜尋,直到L和R重合,因此其時間複雜度是O(n);而整個快速排序演算法的時間複雜度與劃分的趟數有關。
理想的情況:每次劃分所選擇的中間數恰好將當前序列幾乎等分,經過log2n趟劃分,便可得到長度為1的子表。這樣,整個演算法的時間複雜度為O(nlog2^n)
最壞的情況:每次所選的中間數是當前序列中的最大或最小元素,這使得每次劃分所得的子表中一個為空表,另一子表的長度為原表的長度-1。這樣,長度為n的資料表的快速排序需要經過n趟劃分,使得整個排序演算法的時間複雜度為O(n^2)。
快速排序的平均時間複雜度也是O(nlog2n)。因此,該排序方法被認為是目前最好的一種內部排序方法。

相關文章