演算法排序 歸併排序

2022-09-15 11:06:13 字數 4473 閱讀 5398

歸併排序(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):

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)

2、測試結果

[1, 2, 3, 4, 5, 6, 7, 8]
2、一次的完整歸併

1、實現**

def merge(li, low, mid, high):

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)

2、測試結果

[1, 9, 10, 4, 0, 11, 18, 5, 7, 8, 17, 15, 19, 2, 14, 16, 6, 12, 13, 3]

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

1、實現**

def merge(li, low, mid, high):

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)

2、range(20)測試結果

[10, 6, 4, 18, 0, 12, 5, 15, 14, 17, 7, 8, 11, 13, 2, 1, 19, 3, 9, 16]

[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]

3、range(10)測試結果

排序演算法 歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 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...