1. 程式人生 > >排序算法(高級篇,整理自學堂在線鄧俊輝老師《數據結構》課程)

排序算法(高級篇,整理自學堂在線鄧俊輝老師《數據結構》課程)

實現 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)通過適當的交換,可使任意元素轉換為軸點

技術分享圖片

示意圖如上。

排序算法(高級篇,整理自學堂在線鄧俊輝老師《數據結構》課程)