快速排序quicksort筆記

2021-10-08 10:17:16 字數 1174 閱讀 7404

快排採用了分治法的思想和遞迴的方式進行排序,每次遞迴都會確定乙個位置的數值(此處是位置i),且大於等於左側所有值,小於等於右側所有值。

def

_quicksort

(l, left, right)

:# left 到 right 裡的都是未經過排序的

if left >= right:

return

i, j = left, right

# 如果list原本是降序排序,則演算法時間會退化為o(n^2)

# 互換最左元素和中間元素可預防這種情況

mid = left +

(right - left /2)

l[left]

, l[mid]

= l[mid]

, l[left]

key = l[left]

while i < j:

# 先從後往前掃,直到小於key

while i < j and key >= l[j]

: j -=

1 a[i]

= a[j]

# 此時a[i]已經backup到了key,可以放心覆蓋

# 再從前往後掃,直到大於key

while i < j and key <= l[j]

: i +=

1 a[j]

= a[i]

# 此時a[j]已經放到原本的a[i],可以放心覆蓋

# 不斷重複j往前,i往後,直到 i == j

# i == j

a[i]

= key

_quicksort(l, left, i -1)

_quicksort(l, i +

1, right)

defquicksort

(l):

_quicksort(l,0,

len(l)-1

)if __name__ ==

"__main__"

: l =[66

,42,52

,78,99

,11] quicksort(l)

print

(l)# [11, 42, 52, 66, 78, 99]

參考文獻

快速排序(Quicksort)學習筆記

看完鄧俊輝的 資料結構 第三版 中快速排序後的學習總結 一.快速排序 quicksort 基於分治策略的又一經典演算法。類似於歸併排序 mergesort 將序列分為前後兩個子串行,並對這兩個規模更小的子串行進行遞迴。quicksort和mergesort都採用了分治策略。但quicksort要求前...

排序演算法筆記 快速排序 Quicksort

using system using system.collections.generic using system.linq using system.text namespace test sort array,0,array.length 1 console.readline 一次排序單元,完...

快速排序 QuickSort

快速排序通常用於排序的最佳的使用選擇,其期望執行時間為 o nlgn 能夠進行就地排序。最壞執行時間為 o n 2 演算法描述 分解 divide 陣列 a beg end 被劃分為兩個子陣列 a beg mid 1 和a mid 1 end 使得a beg mid 1 中的資料都小於 a mid ...