[簡介]算法
快速排序(英語:Quicksort),又稱劃分交換排序(partition-exchange sort),最先由東尼·霍爾提出。在平均情況下,排序n個項目要Ο(n log n)次比較。在最壞情況下則須要Ο(n2)次比較,但這種情況並不常見。事實上,快速排序一般明顯比其餘Ο(n log n)算法更快,由於它的內部循環(inner loop)能夠在大部分的架構上頗有效率地被實現出來。架構
[算法複雜度]ide
僅針對非原地版本進行討論oop
非原地版本的快速排序,在它的任何遞歸調用前須要使用O(n)空間。在最好的狀況下,它的空間仍然限制在O(n),由於遞歸的每一階中,使用與上一次所使用最多空間的一半,且ui
它的最壞狀況是很恐怖的,須要spa
空間,遠比數列自己還多。若是這些數列元素自己本身不是固定的大小,這個問題會變得更大;舉例來講,若是數列元素的大部分都是不一樣的,每個將會須要大約O(log n)爲原來存儲,致使最好狀況是O(n log n)和最壞狀況是O(n2 log n)的空間需求。code
[核心算法]xml
快速排序使用分治法(Divide and conquer)策略來把一個序列(list)分爲兩個子序列(sub-lists)。blog
步驟爲:排序
遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,可是這個算法總會結束,由於在每次的迭代(iteration)中,它至少會把一個元素擺到它最後的位置去。
[Source Code]
def quick_sort(alist=None): blist = alist[:] N = len(blist) if N <= 1: return blist pivot = blist[0] return quick_sort([x for x in blist[1:] if x < pivot]) + [pivot] + quick_sort([x for x in blist[1:] if x >= pivot])
[示意圖]