快速排序也是使用了分治思想的排序方法,但與歸併排序不一樣的是“分”的時候的依據。歸併排序“分”的依據是對半分,不管大小,而快速排序則是選定數組中的一個值,以這個值爲依據,將數組分爲三個部分:小於這個值的部分,大於等於這個值的部分,這個值。這樣就以選定的點將數組分爲兩部分(小於值的部分,大於等於值的部分),然後再通過迭代對這兩個部分分別繼續執行這樣一個“分”的過程,直至最後只剩下1-2個元素,即無法再“分”時,此時數組也排序完成。
下面以圖示的方法展示一下第一次“分”的過程。
首先給出要排序的數組,和分別爲數組的首尾下標。利用和這兩個數進行迭代。令。
迭代過程中分成了這樣幾個部分:
所在的位置是的最新的一個值,在“分”的最後,將返回,即用來比較的值的位置,以供下次迭代。
具體的python代碼實現如下。
#將數組分爲兩部分
def partition(l0,sta,end):
i=sta-1
for j in range(sta,end):
if l0[j]<l0[end]:
i=i+1
#如果j所在的位置的值小於end,則i往前進一步,並與j的值交換,即將一個新的值加入到<end的區域
x=l0[i]
l0[i]=l0[j]
l0[j]=x
#一次“分”結束,將用於比較的值放在應該在的地方(兩個區域的中間)
i=i+1
x=l0[i]
l0[i]=l0[end]
l0[end]=x
return i
def quicksort(l0,sta,end):
#當至少存在兩個元素時,才進行接下來的分解
if sta<end:
mid=partition(l0,sta,end)
#分成的sta—mid-1,mid+1—end兩個區域接着進行分解、迭代
quicksort(l0,sta,mid-1)
quicksort(l0,mid+1,end)
return l0
快速排序的最壞情況,即每次分解時都極其不平衡,分解爲個元素和個元素,這樣分解操作的時間複雜度爲,而對大小爲的數組進行迭代會直接返回,時間複雜度可以忽略。這樣算法運行時間的遞歸式爲
解爲
而最好的情況則是每次都對半分,這樣算出的時間複雜度爲
而即使是每次的劃分達到這樣一個很不平衡的狀態,最終算出的時間複雜度也是,事實上,即使是也是這樣的時間複雜度。(結論和推導均來自《算法導論》)
所以快速排序法的期望時間複雜度爲,是一個優秀的排序算法。