1. 程式人生 > >《算法圖解》筆記(3) 快速排序

《算法圖解》筆記(3) 快速排序

eat 常量 排序 val 以及 rec 函數調用 這就是 數字

基線條件(base case)和遞歸條件(recursive case)

遞歸條件指的是函數調用自己,而基線條件則指的是函數不再調用自己,從而避免形成無限循環。

分而治之(divide and conquer,D&C)

問題:假設你是農場主,有一小塊土地。大小為640m × 1680m。你要將這塊地均勻地分成方塊,且分出的方塊要盡可能大。如何將一塊地均勻地分成方塊,並確保分出的方塊是最大的呢?

使用D&C策略!D&C算法是遞歸的。使用D&C解決問題的過程包括兩個步驟。

  1. 找出基線條件,這種條件必須盡可能簡單。(涉及數組的遞歸函數時,基線條件通常是數組為空或只包含一個元素。)
  2. 不斷將問題分解(或者說縮小規模),直到符合基線條件。

快速排序

快速排序的工作原理。首先,從數組中選擇一個元素,這個元素被稱為基準值(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:] if
i>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) 快速排序