歸併排序(merge-sort)是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。
分而治之
分解:將列表越分越小,直至分成乙個元素。
乙個元素是有序的。
合併:將兩個有序列表歸併,列表越來越大。
可以看到這種結構很像一棵完全二叉樹,本文的歸併排序我們採用遞迴去實現(也可採用迭代的方式去實現)。分階段可以理解為就是遞迴拆分子序列的過程,遞迴深度為log2n。
if low < high:#至少兩個元素
mid = (low + high) // 2
_merge_sort(li,low,mid)
_merge_sort(li,mid+1,high)
#merage(li,low,mid,high)
print(li[low:high+1])
1、歸併排序之歸併
1、實現**
def merge(li, low, mid, high):2、測試結果i = low
j = mid + 1
ltmp =
while i<=mid and j<=high: # 只要左右兩邊都有數
if li[i] < li[j]:
i += 1
else:
j += 1
# while執行完,肯定有一部分沒數了
while i <= mid:
i += 1
while j <= high:
j += 1
li[low:high+1] = ltmp
li = [2,4,5,7,1,3,6,8]
merge(li, 0, 3, 7)
print(li)
[1, 2, 3, 4, 5, 6, 7, 8]2、一次的完整歸併
1、實現**
def merge(li, low, mid, high):2、測試結果i = low
j = mid + 1
ltmp =
while i<=mid and j<=high: # 只要左右兩邊都有數
if li[i] < li[j]:
i += 1
else:
j += 1
# while執行完,肯定有一部分沒數了
while i <= mid:
i += 1
while j <= high:
j += 1
li[low:high+1] = ltmp
# li = [2,4,5,7,1,3,6,8]
# merge(li, 0, 3, 7)
# print(li)
def merge_sort(li, low, high):
if low < high: #至少有兩個元素,遞迴
mid = (low + high) //2
merge_sort(li, low, mid)
merge_sort(li, mid+1, high)
merge(li, low, mid, high)
li = list(range(20))
import random
random.shuffle(li)
print(li)
merge_sort(li, 0, len(li)-1)
print(li)
[1, 9, 10, 4, 0, 11, 18, 5, 7, 8, 17, 15, 19, 2, 14, 16, 6, 12, 13, 3]1、實現**[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
def merge(li, low, mid, high):2、range(20)測試結果i = low
j = mid + 1
ltmp =
while i<=mid and j<=high: # 只要左右兩邊都有數
if li[i] < li[j]:
i += 1
else:
j += 1
# while執行完,肯定有一部分沒數了
while i <= mid:
i += 1
while j <= high:
j += 1
li[low:high+1] = ltmp
def merge_sort(li, low, high):
if low < high: #至少有兩個元素,遞迴
mid = (low + high) //2
merge_sort(li, low, mid)
merge_sort(li, mid+1, high)
merge(li, low, mid, high)
print(li[low:high+1])
li = list(range(10))
import random
random.shuffle(li)
print(li)
merge_sort(li, 0, len(li)-1)
print(li)
[10, 6, 4, 18, 0, 12, 5, 15, 14, 17, 7, 8, 11, 13, 2, 1, 19, 3, 9, 16]3、range(10)測試結果[6, 10]
[4, 6, 10]
[0, 18]
[0, 4, 6, 10, 18]
[5, 12]
[5, 12, 15]
[14, 17]
[5, 12, 14, 15, 17]
[0, 4, 5, 6, 10, 12, 14, 15, 17, 18]
[7, 8]
[7, 8, 11]
[2, 13]
[2, 7, 8, 11, 13]
[1, 19]
[1, 3, 19]
[9, 16]
[1, 3, 9, 16, 19]
[1, 2, 3, 7, 8, 9, 11, 13, 16, 19]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
排序演算法 歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另...
排序演算法 歸併排序
include include define status int define max 20 typedef struct elemtype typedef struct sqlist void inital sqlist l 初始化 bool lt int i,int j void merge ...
排序演算法 歸併排序
歸併排序的思想其實完全是分治法的思想的體現,它完全遵循分治法的模式。這裡有必要再重提下分治法的思想 將原有的問題分解為幾個規模較小的但類似於原問題的子問題,遞迴的求解這些子問題,然後再合併這些子問題的解來求得原問題的解。現在來看看歸併排序的操作 1 將等待排序的含有 n 個元素的序列分解成各具有 n...