排序入門之快速排序簡單入門

本文章只是簡單講解快速排序的原理,並沒有深入進行討論

希望這篇文章適合你  :)


快速排序被廣泛認爲它是解決一般問題的最佳排序算法,它比較適合解決大規模數據的排序。

原理思想:(順序是從小到大)

快速排序首先選取一個“基準數”通過基準數將大於它小於它的數無序地放在基準數的兩邊

什麼叫無序?就是大於基準數的所有數只需要放在它的右邊,這些數之間不被要求爲有序,同樣,小於基準數的數所有隻需要放在它的左邊,不被要求其有序

這樣就利用“基準數”對整個原始數列進行了分割成兩部分,然後通過遞歸,用上述同樣的方法選取一個基準數進行分割,直至整個數列被分割的各部分已不能再被分割


下面進行演示,基準數用定義一個變量 pivot 存放,每一部分的分割開始都是選擇low下標對應的數

這裏演示的就是代碼中 partition函數 的實現

開始:(假設low=0,high=6.  當前的low是紅色,high是綠色,pivot是藍色,被放置好在基準數兩邊的數用藍色字體表示)

原始數列a[7]
0 1 2 3 4 5 6
5 4 7 9 2 1 3

首先,選取基準數進行分割,選擇low下標當前的元素5爲基準數,即pivot = 5

然後將 pivot  high 下標對應的數進行對比

  • 如果 <= a[high],則 low++
  • 如果 > a[high]  ,則交換 a[low] 與 a[high]

結果如下:

第一次
0 1 2 3 4 5 6
3 4 7 9 2 1 5
從上圖可以看出,a[low] 與 a[high]已被交換

注意!

在這個時候,因 pivot = 5 被交換到 high 的下標處

那麼接下來的比較就是將pivot與low下標當前的數進行對比

  • 如果 >= a[low],則 low++
  • 如果 < a[low]  ,則交換 a[low] 與 a[high]

這裏是比low對應的數大,結果如下:

第二次
0 1 2 3 4 5 6
3 4 7 9 2 1 5

繼續使用pivot = 5 與 a[low] 進行對比

結果如下:

第三次
0 1 2 3 4 5 6
3 4 7 9 2 1 5

繼續使用 pivot = 5 與 a[low] 進行對比

這時候 pivot = 5比 a[low] 小,所以又進行a[low] 與 a[high]交換

結果如下:

第四次
0 1 2 3 4 5 6
3 4 5 9 2 1 7

注意!

在這個時候,因pivot = 5被交換到low的下標處

那麼接下來的比較就是將pivot與high下標當前的數進行對比

  • 如果 >= a[high],則 high--
  • 如果 < a[high]  ,則交換 a[low] 與 a[high]

結果如下:

第五次
0 1 2 3 4 5 6
3 4 5 9 2 1 7
繼續使用 pivot = 5 與 a[high] 進行對比

同樣進行交換,結果如下:

第六次
0 1 2 3 4 5 6
3 4 1 9 2 5 7
繼續使用 pivot = 5 與 a[low] 進行對比

結果如下:(low++

第七次
0 1 2 3 4 5 6
3 4 1 9 2 5 7
繼續使用 pivot = 5 與 a[low] 進行對比

結果如下:

第八次
0 1 2 3 4 5 6
3 4 1 5 2 9 7
繼續使用 pivot = 5 與 a[high] 進行對比

結果如下:(high--

第九次
0 1 2 3 4 5 6
3 4 1 5 2 9 7
繼續使用 pivot = 5 與 a[high] 進行對比

結果如下:(最終結果low == high橙色表示)

第九次
0 1 2 3 4 5 6
3 4 1 2 5 9 7
最後由於 low++  所以 low == high

到這裏,已經利用 基準數pivot = 5 把這個數列分爲了兩部分(5 的左邊都是小於它的,右邊都是大於它的)

然後遞歸。用同樣的方法,對分割出來的兩部分用“基準數”繼續進行分割

/快排函數  
void sort(int *s, int low, int high)  
{  
    int    pivot;  
    //if語句的判斷是結束遞歸的簡單情景,不能缺  
    if (low < high)  
    {  
        // partition 函數就是利用基準數進行分割的功能函數,這個函數是重點  
        pivot = partition(s, low, high);  
  
        sort(s, pivot + 1, high);  
        sort(s, low, pivot - 1);   
    }  
}  
partition 函數代碼:
//這個函數就是上面演示的代碼實現  
int partition(int *s, int low, int high)  
{  
    int    pivot;  
    pivot = s[low];  
  
    while (low < high)  
    {  
        while (low < high && pivot <= s[high])  
        {  
            high--;  
        }  
        swap(&s[low], &s[high]);  
        while (low < high && pivot >= s[low])  
        {  
            low++;  
        }  
        swap(&s[high], &s[low]);  
    }  
    return  low;  
}  



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