排序算法之歸並排序的python實現


采用分治法:

分割:遞歸地把當前序列平均分割成兩半。

集成:在保持元素順序的同時將上一步得到的子序列集成到一起(歸並)。

歸並操作(歸並算法),指的是將兩個已經排序的序列合並成一個序列的操作。歸並排序算法依賴歸並操作。

遞歸法(Top-down)

1.申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合並后的序列

2.設定兩個指針,最初位置分別為兩個已經排序序列的起始位置

3.比較兩個指針所指向的元素,選擇相對小的元素放入到合並空間,並移動指針到下一位置

4.重復步驟3直到某一指針到達序列尾

5.將另一序列剩下的所有元素直接復制到合並序列尾

迭代法(Bottom-up)

原理如下(假設序列共有 n個元素):

1.將序列每相鄰兩個數字進行歸並操作,形成 c e i l ( n / 2 ) 個序列,排序后每個序列包含兩/一個元素

2.若此時序列數不是1個則將上述序列再次歸並,形成 c e i l ( n / 4 )個序列,每個序列包含四/三個元素

3.重復步驟2,直到所有元素排序完畢,即序列數為1

下面為快速排序的代碼實現:

def merge_sort(lst):
    if len(lst) <= 1:
        # 當列表元素只有一個的時候,直接返回
        return lst
    mid = len(lst) // 2
    left = lst[:mid]
    right = lst[mid:]

    left = merge_sort(left)
    right = merge_sort(right)
    # 遞歸的進行排序
    result = []
    while left and right:
        if left[0] <= right[0]:
            result.append(left.pop(0))
        else:
            result.append(right.pop(0))
    if left:
        result += left
    if right:
        result += right
    return result
    # 返回排序后的結果


if __name__ == "__main__":
    li = [9, 4, 2, 3.6, -1, 0, 25, -34, 8, 9, 1, 0]
    print("排序前的隊列:",li)
    print("排序后的隊列:", merge_sort(li))


免責聲明!

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



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