歸併排序
歸併排序採用分而治之的原理:下圖中的倒數第三行表示為第一次合併後的資料。其中一組資料為 4 8 , 5 7。該兩組資料合併方式為:每一小組資料中指定乙個指標,指標指向每小組資料的第乙個元素,通過指標的偏移指定資料進行有序排列。排列情況如下:- 將乙個序列從中間位置分成兩個序列;
- 在將這兩個子串行按照第一步繼續二分下去;
- 直到所有子串行的長度都為1,也就是不可以再二分截止。這時候再兩兩合併成乙個有序序列即可。
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...