《演算法導論》第七章 快速排序 python實現

2021-08-26 05:37:07 字數 1765 閱讀 3150

快速排序時間複雜度平均o(nlgn),最壞的話是o(n^2),原址排序,是不穩定的排序演算法

過程可以描述為兩步:

1.分解,將a[p...r]分解為a[p...q-1]和a[q+1...r],前者每個元素均小於a[q],後者每個元素均大於a[q]

2.通過遞迴對a[p...q-1]和a[q+1...r]進行排序

python實現如下:

def quick_sort(a, first, last):

if first < last:

q = partition(a, first, last)

quick_sort(a, first, q-1)

quick_sort(a, q+1, last)

def partition(a, first, last):

i = first - 1

x = a[last]

for j in range(first, last):

if a[j] <= x:

i += 1

a[i], a[j] = a[j], a[i]

a[i+1], a[last] = a[last], a[i+1]

return i+1

if __name__ == "__main__":

list = [13,19,9,5,12,11,8,7,4,21,11,2,6,11]

print(list)

quick_sort(list, 0, len(list)-1)

print(list)

課後思考題7.2有關於重複元素的處理,希望在分解時可以返回兩個下標, q和t,使得a[p...q-1]都是小於a[q],a[q+1...t]都等於a[q],a[t+1..r]都大於a[q]。

我的想法是,與快速排序類似,變化的一點在於:

遇上等於a[q]的元素,只移動t,交換t後面的元素和j的元素,當遇上小於a[q]的元素時,先交換a[j]和後移後的a[t],再移動i,將a[t]與a[i]交換,這麼講感覺講不清楚orz。。。具體操作還是看**清晰點

def quick_sort(a, first, last):

if first < last:

i,t = partition(a, first, last)

quick_sort(a, first, i-1)

quick_sort(a, t+1, last)

def partition(a, first, last):

i = first - 1

t = first - 1

x = a[last]

for j in range(first, last):

if a[j] < x:

t += 1

a[t], a[j] = a[j], a[t]

i += 1

a[i], a[t] = a[t], a[i]

elif a[j] == x:

t += 1

a[t], a[j] = a[j], a[t]

a[t+1], a[last] = a[last], a[t+1]

return i+1, t+1

if __name__ == "__main__":

list = [13,19,9,5,12,11,8,7,4,21,11,2,6,11]

print(list)

quick_sort(list, 0, len(list)-1)

print(list)

演算法導論 第七章《快速排序》

本章介紹了快速排序及其演算法分析,快速排序採用的是分治演算法思想,對包含n個數的輸入陣列,最壞情況下執行時間為 n 2 但是平均效能相當好,期望的執行時間為 nlgn 另外快速排序能夠就地排序 我理解是不需要引入額外的輔助空間,每次劃分能確定乙個元素的具體位置 在虛擬環境中能很好的工作。快速排序演算...

演算法導論 第七章 快速排序

快速排序通常是實際應用中最好的選擇,因為它的平均效能非常好,它的期望時間複雜度為o nlng 而且隱含的常數因子非常小。另外,它還是原址排序。quicksort a,p,r if p隨著程式的執行,陣列被劃分為4個 小於主元,大於主元,未劃分,主元,可能有空的 區域。對於partition中的第3 ...

演算法導論第七章快速排序

一 快速排序概述 關於快速排序,我之前寫過兩篇文章,一篇是寫vc庫中的快排函式,另一篇是寫了快排的三種實現方法。現在再一次看演算法導論,發現對快速排序又有了些新的認識,總結如下 1 快速排序最壞情況下的時間複雜度為o n 2 雖然最壞情況下效能較差,但快排在實際應用中是最佳選擇。原因在於 其平均效能...