標籤:coding ref 過程 def style 迴圈 元素 個數 交換
A、快速排序
1)設定兩個變數i、j,排序開始的時候:i=0,j=N-1;2)以第一個數組元素作為關鍵資料,賦值給
key,即
key=A[0];3)從j開始向前搜尋,即由後開始向前搜尋(j--),找到第一個小於
key的值A[j],將A[j]和A[i]互換;4)從i開始向後搜尋,即由前開始向後搜尋(i++),找到第一個大於
key的A[i],將A[i]和A[j]互換;
5)重複第3、4步,直到i=j; (3,4步中,沒找到合格值,即3中A[j]不小於key,4中A[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到合格值,進行交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)。
如列表:
lst =[6,1,2,7,9,3,4,5,10,8]
[6, 1, 2, 7, 9, 3, 4, 5, 10, 8]
從右向左開始移動第一次
當j移動到5此時lst[j]小於key6
i j 值互換
[5, 1, 2, 7, 9, 3, 4, 6, 10, 8]
從左向右開始移動第一次
當i移動到7此時lst[i]大於key6
i j 值互換
[5, 1, 2, 6, 9, 3, 4, 7, 10, 8]
從右向左開始移動第二次
當j移動到4此時lst[j]小於key6
i j 值互換
[5, 1, 2, 4, 9, 3, 6, 7, 10, 8]
從左向右開始移動第二次
當i移動到9此時lst[i]大於key6
i j 值互換
[5, 1, 2, 4, 6, 3, 9, 7, 10, 8]
從右向左開始移動第三次
當j移動到3此時lst[j]小於key6
i j 值互換
[5, 1, 2, 4, 3, 6, 9, 7, 10, 8]
此時6 剛好在中間
lst分成兩部分
左邊[5, 1, 2, 4, 3]
右邊[9, 7, 10, 8]
重新按照剛剛排序方法
將得到結果
左邊[3, 1, 2, 4, 5]
右邊[8, 7, 9, 10]
繼續排序
.....(遞迴)
實現方法:
面向過程:
# -*- coding: gbk -*- __author__ = ‘HZQ‘lst = [6,1,2,7,9,3,4,5,10,8]i=0j=len(lst)-1key=lst[0]print(lst)print("從右向左開始移動第一次")while lst[j]>=key and j>i: j-=1print("當j移動到{}此時lst[j]小於key{}".format(lst[j],key))print("i j 值互換")lst[i],lst[j]=lst[j],lst[i]print(lst)print("從左向右開始移動第一次")while lst[i]<=key and j>i: i+=1print("當i移動到{}此時lst[i]大於key{}".format(lst[i],key))print("i j 值互換")lst[i],lst[j]=lst[j],lst[i]print(lst)print("從右向左開始移動第二次")while lst[j]>=key and j>i: j-=1print("當j移動到{}此時lst[j]小於key{}".format(lst[j],key))print("i j 值互換")lst[i],lst[j]=lst[j],lst[i]print(lst)print("從左向右開始移動第二次")while lst[i]<=key and j>i: i+=1print("當i移動到{}此時lst[i]大於key{}".format(lst[i],key))print("i j 值互換")lst[i],lst[j]=lst[j],lst[i]print(lst)print("從右向左開始移動第三次")while lst[j]>=key and j>i: j-=1print("當j移動到{}此時lst[j]小於key{}".format(lst[j],key))print("i j 值互換")lst[i],lst[j]=lst[j],lst[i]print(lst)
物件導向:
# -*- coding: gbk -*- __author__ = ‘HZQ‘lst = [6,1,2,7,9,3,4,5,10,8]def minddle_index(lst,low,high): start_index=low#最左邊 end_index=high#左右邊 if start_index<end_index:#前提條件右邊大於左邊 key=lst[start_index]#設定參照key while end_index>start_index: while lst[end_index]>=key and end_index>start_index: end_index-=1 lst[start_index],lst[end_index]=lst[end_index],lst[start_index] while lst[start_index]<=key and end_index>start_index: start_index+=1 lst[start_index],lst[end_index]=lst[end_index],lst[start_index] #迴圈排序,遞迴 minddle_index(lst,low,start_index-1)#左邊lst再次排序 minddle_index(lst,end_index+1,high)#右邊lst再次排序minddle_index(lst,0,len(lst)-1)print(lst)
python 八大排序快速排序