Python3 快速排序

參考:《算法圖解》第4章 快速排序 

$ 分而治之(divide and conquer,D&C
D&C算法是遞歸的,步驟:
(1)找出基線條件,儘可能簡單
(2)不斷將問題分解,直到符合基線條件

提示:編寫涉及數組的遞歸函數時,基線條件通常是數組爲空或只包含一個元素。

$ 快速排序
(1)基線條件:數組爲空或只包含一個元素 -> 不用排序,直接返回原數組即可
def quicksort(array):
    if len(array) < 2:
        return array
        
(2)從數組中選擇一個元素作爲 基準值(pivot)
暫時將元素的第一個元素作爲基準值 -> 找出比基準值小的元素 和 比基準值大的元素
【例】
[33,15,10] 以33爲基準值
[15,10] , 33 , []  -> 得到 一個由所有小於基準值的數字構成的子數組,基準值,一個由所有大於基準值的數字構成的子數組
這被稱爲 分區(partitioning),得到的兩個子數組是無序的

如果這兩個數組是有序的事情就好辦了,於是要分別對子數組進行排序

quicksort([15,10]) + [33] + quicksort([]),不斷對子數組進行快速排序,直到數組拆解爲最簡單的情況(最多隻有一個元素)

$ 歸納證明
兩步:基線條件 + 歸納條件
【例】證明自己能爬到梯子頂端
歸納條件:如果站在梯子的一個橫檔上,就能將腳放到上一個橫檔上
基線條件:腳已經放在第一個橫檔上

$ 快速排序代碼

def quicksort(array):
    if len(array) < 2:
        return array
    else:
        pivot = array[0]
        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,21,7]))

[10,5,2,3,21,7] 以10作爲基準值
[5,2,3,7] ,[10], [21]
[2,3],[5],[7] , [10] , [21]
[],[2],[3] ,[5], [7], [10] , [21]
-> [2,3,5,7,10,21]

 

發佈了92 篇原創文章 · 獲贊 2 · 訪問量 5704
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章