*快速排序 最優(yōu)時(shí)間復(fù)雜度為nlogn止剖,因?yàn)橐瓿蒼個(gè)嵌套調(diào)用揭鳞,,但比冒泡排序要快
python實(shí)現(xiàn)邏輯過(guò)程是這樣得缀磕。
1.設(shè)置兩個(gè)游標(biāo) left跟right
2.設(shè)置基準(zhǔn)值缘圈,網(wǎng)上有方案設(shè)置中間數(shù)為基準(zhǔn)值,但計(jì)算比較麻煩袜蚕,而且并不一定高效糟把,這里設(shè)置列表最右的那個(gè)元素為基準(zhǔn)值,
3.left游標(biāo) 從左向右移動(dòng)牲剃,當(dāng)游標(biāo)指向元素大于基準(zhǔn)值時(shí)遣疯,停下,交換right游標(biāo)指向的元素
4 同理 right右標(biāo)向左移動(dòng)
5 當(dāng)左右游標(biāo)相等時(shí)停止循環(huán)凿傅,賦值基準(zhǔn)值給左游標(biāo)指向的元素
6 對(duì)基準(zhǔn)值左邊的元素遞歸缠犀,重復(fù)以上步驟,
7 設(shè)置條件退出遞歸聪舒。
下面是代碼實(shí)現(xiàn)
alist= [22,21,34,65,12,89,3,9,66]
def qucik_sort(alist,low, high):
# 退出遞歸條件
# left=right
while low>high:
return alist
left = low
right = high
base_value = alist[right]
while left < right:
while left<right and alist[left] < base_value:
left += 1
# 跳出循環(huán)條件
# alist[left]>=base_value
alist[right]=alist[left]
while right>left and alist[right]>base_value:
right -= 1
# 跳出循環(huán)條件
# alist[right]<=base_value
alist[left]=alist[right]
# 把基準(zhǔn)值賦值給游標(biāo)停留的元素
alist[right] = base_value
# 繼續(xù)對(duì)游標(biāo)左右的隊(duì)列遞歸快速排序
qucik_sort(alist,low,left-1)
qucik_sort(alist,left+1,len(alist)-1)
print(alist)
if __name__ == '__main__':
low = 0
high = len(alist)-1
qucik_sort(alist,low,high)
輸出結(jié)果為 [3, 9, 12, 21, 22, 34, 65, 66, 89]
簡(jiǎn)潔的代碼 辨液,很pythonic.