一、快排思想
快速排序可以理解為是對冒泡排序的一種改進,把一組數,按照初始選定的標桿(參照數),
分別從兩端開始排序,左端'i'只要小於標桿(參照數)的數,右端'j'只要大於標桿(參照數)的數,
i----->middle<-----j 每一次排序循環條件為 i != j 左端 i 不等於右端 j,
每次排序,右端j先排,從右往左找,直到找到第一個比標桿(參照數)小的數就停下來。
而 i 從左往右,除了找到比自己大的數停下來之外,還要滿足i<j的條件。
當i和j都停下來時,我們就交換索引i處的值和索引j處的值,如果 i != j 就繼續從當前j往左邊排序找到比標桿(參照值)小的數,
i繼續從當前位置向右找比自己大的數,這樣循環直到 i == j 意味着,當前i、j索引的值,除了參照值左邊都比標桿(參照數)小,
右邊都比參照數大,然后第一次排序把標桿和i處的值交換,就算完成了,
然后把該數組分成了兩段,分別再遞歸調用自身繼續排序,直到每輪剩下兩個數或者 j 先找,走到了 i 的位置,所以遞歸調用停止的條件就應該是 i>j-1。
二、python 實現
def quickSort(list, start, end):
if start>end:
return
i, j = start, end
flag = list[start]
while True:
#先從右往左找
while j>i and list[j] >= flag:
j = j - 1
#再從左往右找
while i< j and list[i] <= flag:
i += 1
if i < j:
list[i], list[j] = list[j], list[i]
elif i == j:
#當左右相等時第一次遞歸結束
list[start], list[i] = list[i], list[start]
break
quickSort(list,start, i-1)
quickSort(list, i+1, end)
list_test = [7, 4, 7, 2, 4,19, 10, 4, 9, 5, 8, 10]
print(list_test)
quickSort(list_test, 0, (len(list_test)-1))
print(list_test)
#結果為:
[7, 4, 7, 2, 4, 19, 10, 4, 9, 5, 8, 10]
[2, 4, 4, 4, 5, 7, 7, 8, 9, 10, 10, 19]
大同小異,這樣寫
def quick_sort(ql,start, end):
if start > end:
return
mark = ql[start]
i, j = start, end
while i<j:
while i<j and ql[j] >= mark:
j -= 1
while i<j and ql[i] <= mark:
i += 1
ql[i], ql[j] = ql[j], ql[i]
ql[start], ql[i] = ql[i], ql[start]
quick_sort(ql,start, i-1)
quick_sort(ql, i+1, end)