排序入門之快速排序簡單入門
本文章只是簡單講解快速排序的原理,並沒有深入進行討論
希望這篇文章適合你 :)
快速排序被廣泛認為它是解決一般問題的最佳排序演算法,它比較適合解決大規模資料的排序。
原理思想:(順序是從小到大)
快速排序首先選取一個“基準數”,通過基準數將大於它和小於它的數無序地放在基準數的兩邊
什麼叫無序?就是大於基準數的所有數只需要放在它的右邊,這些數之間不被要求為有序,同樣,小於基準數的數所有隻需要放在它的左邊,不被要求其有序
這樣就利用“基準數”對整個原始數列進行了分割成兩部分,然後通過遞迴,用上述同樣的方法選取一個基準數進行分割,直至整個數列被分割的各部分已不能再被分割
下面進行演示,基準數用定義一個變數 pivot 存放
這裡演示的就是程式碼中 partition函式 的實現
開始:(假設low=0,high=6. 當前的low是紅色,high是綠色,pivot是藍色,被放置好在基準數兩邊的數用藍色字型表示)
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 |
注意!
在這個時候,因 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 |
結果如下:
0 | 1 | 2 | 3 | 4 | 5 | 6 |
3 | 4 | 7 | 9 | 2 | 1 | 5 |
這時候 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 |
同樣進行交換,結果如下:
0 | 1 | 2 | 3 | 4 | 5 | 6 |
3 | 4 | 1 | 9 | 2 | 5 | 7 |
結果如下:(low++)
0 | 1 | 2 | 3 | 4 | 5 | 6 |
3 | 4 | 1 | 9 | 2 | 5 | 7 |
結果如下:
0 | 1 | 2 | 3 | 4 | 5 | 6 |
3 | 4 | 1 | 5 | 2 | 9 | 7 |
結果如下:(high--)
0 | 1 | 2 | 3 | 4 | 5 | 6 |
3 | 4 | 1 | 5 | 2 | 9 | 7 |
結果如下:(最終結果low == high,橙色表示)
0 | 1 | 2 | 3 | 4 | 5 | 6 |
3 | 4 | 1 | 2 | 5 | 9 | 7 |
到這裡,已經利用 基準數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;
}