《算法圖解》筆記(3) 快速排序
阿新 • • 發佈:2019-03-05
eat 常量 排序 val 以及 rec 函數調用 這就是 數字
基線條件(base case)和遞歸條件(recursive case)
遞歸條件指的是函數調用自己,而基線條件則指的是函數不再調用自己,從而避免形成無限循環。
分而治之(divide and conquer,D&C)
問題:假設你是農場主,有一小塊土地。大小為640m × 1680m。你要將這塊地均勻地分成方塊,且分出的方塊要盡可能大。如何將一塊地均勻地分成方塊,並確保分出的方塊是最大的呢?
使用D&C策略!D&C算法是遞歸的。使用D&C解決問題的過程包括兩個步驟。
- 找出基線條件,這種條件必須盡可能簡單。(涉及數組的遞歸函數時,基線條件通常是數組為空或只包含一個元素。)
- 不斷將問題分解(或者說縮小規模),直到符合基線條件。
快速排序
快速排序的工作原理。首先,從數組中選擇一個元素,這個元素被稱為基準值(pivot)。
接下來,找出比基準值小的元素以及比基準值大的元素。這被稱為分區(partitioning)。
最後對這兩個子數組進行快速排序,再合並結果,就能得到一個有序數組!
快速排序代碼:
def quicksort(array): if len(array) < 2: return array else: pivot = array[0] less=[] ‘‘‘ for i in array[1:]: if i <= pivot: less.append(i) #列表存入元素用append return less ‘‘‘ #這裏用了python的列表解析,後面小貼士會介紹 less = [i for i in array[1:] if i<=pivot] greater = [i for i in array[1:] ifi>pivot] return quicksort(less) + [pivot] + quicksort(greater) print(quicksort([10,5,2,3])) print(quicksort([10,5,2,3,11,15,12]))
小結
- D&C將問題逐步分解。使用D&C處理列表時,基線條件很可能是空數組或只包含一個元素的數組。
- 實現快速排序時,請隨機地選擇用作基準值的元素。快速排序的平均運行時間為O(n log n)。
- 大O表示法中的常量有時候事關重大,這就是快速排序比合並排序快的原因所在。
- 比較簡單查找和二分查找時,常量幾乎無關緊要,因為列表很長時,O(log n)的速度比O(n)快得多
小貼士
列表解析(List Comprehensions)根據已有列表,高效創建新列表的方式。列表解析是Python叠代機制的一種應用,它常用於實現創建新的列表,因此用在[ ]中。
語法:
- [expression for iter_val in iterable]
- [expression for iter_val in iterable if cond_expr]
例子:1.x = [i for i in list],將一個 list 映射為另一個 list,每個元素設為變量i
2.列出1~10中大於等於4的數字的平方
普通方法:
L = []
or i in range(1,11):
if i >= 4:
L.append(i**2)
print(L)
輸出:[16, 25, 36, 49, 64, 81, 100]
列表解析:
L = [ i**2 for i in range(1,11) if i >= 4 ]
print(L)
輸出:[16, 25, 36, 49, 64, 81, 100]
《算法圖解》筆記(3) 快速排序