Python歸併排序演算法

2021-08-01 19:24:30 字數 2368 閱讀 7044

歸併排序是採用分治法的乙個非常典型的應用。歸併排序的思想就是先遞迴分解陣列,再合併陣列。

將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。然後再比較,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @author : xiaoke

defmerge_sort

(alist):

"""歸併排序"""

n = len(alist)

# 列表中只有乙個元素

if n == 1:

return alist

# 找到中間位置的角標

mid = n // 2

# 對分割後的左半部分進行拆分

left_sorted_li = merge_sort(alist[:mid])

for x in left_sorted_li:

print("左半邊=", x, end=" ")

print(" ")

# 對分割後的右半部分進行拆分

right_sorted_li = merge_sort(alist[mid:])

for y in right_sorted_li:

print("右半邊=", y, end=" ")

print(" ")

return merge(left_sorted_li, right_sorted_li)

# 以下**是做歸併排序,並進行最後序列的合併

defmerge

(left_sorted_li, right_sorted_li):

# 先定義左右的游標,都從起始位置0開始

left, right = 0, 0

merge_result_li =

left_n = len(left_sorted_li)

right_n = len(right_sorted_li)

# 排序並合併

while left < left_n and right < right_n:

# 那邊的元素小,就新增到新的列表中

if left_sorted_li[left] <= right_sorted_li[right]:

left += 1

else:

right += 1

# 如果左半邊或者右半邊有乙個先到末尾,上面的迴圈就退出了

# 那麼就把沒有到末尾那半邊的最後的元素新增到新的序列中,以免數值少算

# 即使為null,會是空列表,那麼也沒有關係,[1,2]+=[1,2]

merge_result_li += left_sorted_li[left:]

merge_result_li += right_sorted_li[right:]

# 將合併後的新列表返回

return merge_result_li

if __name__ == '__main__':

alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]

print("原 alist: %s" % alist)

sorted_alist = merge_sort(alist)

print("排序後的 list :%s" % sorted_alist)

# 結果如下:

# 原 alist: [54, 26, 93, 17, 77, 31, 44, 55, 20]

# 左半邊= 54

# 右半邊= 26

# 左半邊= 26 左半邊= 54

# 左半邊= 93

# 右半邊= 17

# 右半邊= 17 右半邊= 93

# 左半邊= 17 左半邊= 26 左半邊= 54 左半邊= 93

# 左半邊= 77

# 右半邊= 31

# 左半邊= 31 左半邊= 77

# 左半邊= 44

# 左半邊= 55

# 右半邊= 20

# 右半邊= 20 右半邊= 55

# 右半邊= 20 右半邊= 44 右半邊= 55

# 右半邊= 20 右半邊= 31 右半邊= 44 右半邊= 55 右半邊= 77

# 排序後的 list :[17, 20, 26, 31, 44, 54, 55, 77, 93]

最優時間複雜度:o(nlogn)

最壞時間複雜度:o(nlogn)

穩定性:穩定

Python 歸併排序演算法

歸併排序演算法 空間複雜度為o n 時間複雜度為o n log n 演算法穩定,不具有適應性 1 將序列分兩左右兩部分 2 遞迴,重複第一步,直到左右兩部分裡面的元素數量為1 3 合併每個左右的部分,從小到大 4 完成合併 演算法的穩定性是指 對於待排序的序列中,相同項的原來次序不能被改變 演算法的...

python歸併排序 python 歸併排序

排序思路 1.將陣列分成兩組a,b,建立臨時陣列 c,c長度 a b 2.i,j分別屬於a,b 3.若a i b j 將b j 放入c,j 否則 a i 放入c,i 4.迴圈3步驟,將a或b中剩餘的元素放入c,再將c複製到陣列中 5.遞迴3 4直到a,b序列的長度 1 歸併排序 class merg...

歸併演算法 歸併排序

歸併演算法 歸併排序 這周需要用到歸併演算法,於是找了找相關的資料,整理如下 歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low...