前言
只要你懂排序法的原理,排序法程式就會幫助你。
原理
其實這東西就是把大問題分成小問題,先隨機選一個數字,與所有數字進行配對,比他小的在左邊,比他大的在右邊,數字串列再分成兩個數字串列,兩個數字串列在進行排序又或者在分成兩個數字串列排序,最後就可以像影片中的結果一樣。
程式
import randomdef quick_sort(nlst):
'''快速排序法'''
if len(nlst) <= 1:
return nlst left = []
right = []
piv = []
pivot = random.choice(nlst)
for val in nlst:
if val == pivot:
piv.append(val)
elif val < pivot:
left.append(val)
else:
right.append(val)
return quick_sort(left) + piv + quick_sort(right)data = [6, 1, 5, 7, 3, 9, 4, 2, 8]
print("原始串列:", data)
print("排序串列:", quick_sort(data))
請記住以下重點
right:基準點右側
left:基準點左側
piv(pivot):基準點
val:數值(變數)
取基準點
因為在原理有講過,會隨機取一個基準點,小的在他左邊,大的在他右邊,而這個基準就是隨機的(此處為11行)
比對
首先我們我們必須再次搞懂一些東西,基準值不等於數值,直接拿圖來:
我們就以撲克牌來講,一樣都是隨機的數字,隨機的排列,黑桃三的基準值(piv),紅色的為數值(val)。這樣大概能懂吧,不管說他們怎麼排列還是什麼的,基準值都是不變的。
接下來原理懂了,就沒事了,當然我們要先處理的就是基準值(val),比基準值小的在左邊(第15、16行),比基準值大的在右邊(第17、18行),最後再把已經排好的左數列、基準值、右數列合併起來就成功了。
統整
最後把要排的數列排出來,當然還有原始串列還有排序串列,這邊就不多說了。(想知道的可以回去看插入排序法的文章)
總結
好簡單,但好難。