上期文章排序算法——(2)Python實現十大經常使用排序算法爲你們介紹了十大經常使用排序算法的前五種(冒泡、選擇、插入、希爾、歸併),由於快速排序的重要性,因此今天將單獨爲你們介紹一下快速排序!html
排序算法(Sorting algorithm)是計算機科學最古老、最基本的課題之一。要想成爲合格的程序員,就必須理解和掌握各類排序算法。其中"快速排序"(Quicksort)使用得最普遍,速度也較快。它是圖靈獎得主C. A. R. Hoare(託尼·霍爾)於1960時提出來的。
python
快排的實現方式多種多樣,豬哥給你們寫一種容易理解的:分治+迭代,只須要三步:程序員
舉個例子,假設我如今有一個數列須要使用快排來排序:{3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48},咱們來看看使用快排的詳細步驟:面試
26
做爲基準值(基準值能夠隨便選)3
開始和基準值26
進行比較,小於基準值,那麼將它放入左邊的分區中,第二個元素44
比基準值26
大,把它放入右邊的分區中,依次類推就獲得下圖中的第二列。quick_sort = lambda array: array if len(array) <= 1 else quick_sort([item for item in array[1:] if item <= array[0]]) + [array[0]] + quick_sort([item for item in array[1:] if item > array[0]])
是否是很簡潔很秀,若是再有面試官讓你手寫一個快排,你就把這行寫上去吧,面試官見了都要喊你秀兒,哈哈。算法
在你感嘆python吊炸天的同時,你因該考慮到代碼的可讀性問題,lambda
函數設計是爲了代碼的簡潔性,可是濫用的話會致使可讀性變得極差,並且如今pep8代碼規範中也不建議使用lambda
函數了,建議使用關鍵字def
去定義一個函數,因此下面豬哥給你們寫一段符合pythonic
風格的快排代碼數組
def quick_sort(arr): """快速排序""" if len(arr) < 2: return arr # 選取基準,隨便選哪一個均可以,選中間的便於理解 mid = arr[len(arr) // 2] # 定義基準值左右兩個數列 left, right = [], [] # 從原始數組中移除基準值 arr.remove(mid) for item in arr: # 大於基準值放右邊 if item >= mid: right.append(item) else: # 小於基準值放左邊 left.append(item) # 使用迭代進行比較 return quick_sort(left) + [mid] + quick_sort(right)
快速排序有一個缺點就是對於小規模的數據集性能不是很好。可能有人認爲能夠忽略這個缺點不計,由於大多數排序都只要考慮大規模的適應性就好了。可是快速排序算法使用了分治技術,最終來講大的數據集都要分爲小的數據集來進行處理,因此快排分解到最後幾層性能不是很好,因此咱們就可使用揚長避短的策略去優化快排:app
這一改進被證實比持續使用快速排序算法要有效的多。函數
quick_sort = lambda array: array if len(array) <= 1 else quick_sort([item for item in array[1:] if item <= array[0]]) + [array[0]] + quick_sort([item for item in array[1:] if item > array[0]])
快排是面試與考試中最高頻的一種排序算法(沒有之一),請你們務必理解與掌握,歡迎你們在評論區留言,同時也但願你們轉發分享讓更多的人愛上python這門語言。性能