python 實現快速排序


一、快排思想
快速排序可以理解為是對冒泡排序的一種改進,把一組數,按照初始選定的標桿(參照數),

分別從兩端開始排序,左端'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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM