排序算法(高級篇,整理自學堂在線鄧俊輝老師《數據結構》課程)
阿新 • • 發佈:2017-11-19
實現 nbsp ima 序列 .com con uic min 分享圖片
高級篇算法,包括 快速排序和希爾排序。首先介紹快速排序。
1. quicksort,C.A.R.Hoare (1934~)Turing Award,1980
2. 分治策略,分而治之
quicksort VS. mergesort
(1) 將序列分為兩個子序列:S = S1 + S2 規模縮小,彼此獨立(max(S1) <= min(S2))
(2) 在子序列分別【遞歸地】排序之後,原序列自然有序 sorted(S) = sorted(S1) + sorted(S2)
(3) 遞歸基:只剩單個元素時,本身就是解
(4)mergesort的計算難點在於【合】,quicksort的難點在於【分】
好我們來看看quicksort具體實現:
(1) 軸點pivot
左邊的元素均不比它大;右邊的元素均不比它小
(2)【劃分】 [lo, hi - 1] = [lo, mi - 1] + [mi] + [mi + 1, hi - 1];
算法構架如下
1 template <typename T> 2 void Vector<T>::quicksort(Rank lo, Rank hi) 3 { 4 if (hi - lo < 2) // only one element 5 { 6 return; 7 } 8 Rank mi = partition(lo, hi-1) // construct pivot 9 quicksort(lo, mi); 10 quicksort(mi+1, hi); 11 }
可見,最重要的是partition這一步
軸點:(1) 有可能不存在;
(2) 軸點本身必然是就位的。就位是說,它的左邊的元素都不比它大,它右邊的元素都不比它小
(3) 有序的序列中,所有元素均為軸點;反之亦然
因此,快速排序就是將數組中的每個元素逐個轉化為軸點的過程
(4)通過適當的交換,可使任意元素轉換為軸點
示意圖如上。
排序算法(高級篇,整理自學堂在線鄧俊輝老師《數據結構》課程)