歸併排序是採用分治法的乙個非常典型的應用。歸併排序的思想就是先遞迴分解陣列,再合併陣列。將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。然後再比較,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。
#!/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...