排序演算法 歸併排序

2022-05-15 14:23:26 字數 1553 閱讀 2907

歸併排序

歸併排序採用分而治之的原理:

- 將乙個序列從中間位置分成兩個序列;

- 在將這兩個子串行按照第一步繼續二分下去;

- 直到所有子串行的長度都為1,也就是不可以再二分截止。這時候再兩兩合併成乙個有序序列即可。  

下圖中的倒數第三行表示為第一次合併後的資料。其中一組資料為 4 8  ,  5 7。該兩組資料合併方式為:每一小組資料中指定乙個指標,指標指向每小組資料的第乙個元素,通過指標的偏移指定資料進行有序排列。排列情況如下:

1. p1指向4,p2指向5,p1和p2指向的元素4和5進行比較,較小的資料歸併到乙個新的列表中。經過比較p1指向的4會被新增到新的列表中,則p1向後偏移一位,指向了8,p2不變。

2.p1和p2指向的元素8,5繼續比較,則p2指向的5較小,新增到新列表中,p2向後偏移一位,指向了7。

3.p1和p2指向的元素8,7繼續比較,7新增到新列表中,p2偏移指向null,比較結束。

4.最後剩下的指標指向的資料(包含該指標指向資料後面所有的資料)直接新增到新列表中即可。

結束遞迴的條件

4if n <= 1:

5return

alist6#

中間索引

7 mid = n//2

89 left_li =merge_sort(alist[:mid])

10 right_li =merge_sort(alist[mid:])

1112

#指向左右表中第乙個元素的指標

13 left_pointer,right_pointer =0,014#

合併資料對應的列表:該表中儲存的為排序後的資料

15 result =

16while left_pointer < len(left_li) and right_pointer

比較最小集合中的元素,將最小元素新增到result列表中

18if left_li[left_pointer]

1920 left_pointer += 1

21else:22

23 right_pointer += 124#

當左右表的某乙個表的指標偏移到末尾的時候,比較大小結束,將另一張表中的資料(有序)新增到result中

25 result +=left_li[left_pointer:]

26 result +=right_li[right_pointer:]

2728

return

result

2930 alist = [3,8,5,7,6]

31print(merge_sort(alist))

排序演算法 歸併排序

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