快排採用了分治法的思想和遞迴的方式進行排序,每次遞迴都會確定乙個位置的數值(此處是位置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 ...