歸併排序是採用分治法的乙個非常典型的應用。歸併排序的思想就是先遞迴分解陣列,再合併陣列。
將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。然後再比較,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。
歸併排序,分解只有乙個元素的時候為止,乙個元素的序列是有序的。
def merge_sort(alist):
"""歸併演算法"""
n = len(alist)
if 1 == n:
return alist
mid = n // 2
#對左半部分進行歸併排序
left_sorted_li = merge_sort(alist[:mid])
#對左半部分進行歸併排序
right_sorted_li = merge_sort(alist[mid:])
#合併兩個有序集合
left, right = 0, 0
merge_sort_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
merge_sort_li += left_sorted_li[left:]
merge_sort_li += right_sorted_li[right:]
return merge_sort_li
alist = [54,26,93,17,77,31,44,55,20]
a=merge_sort(alist)
print('原列表',alist)
print(a)
結果
可以看出,歸併演算法並沒有改變原列表的順序,而是將排序後的結果以另乙個列表返回。
分解的每一層(共兩組)時間複雜度是o(n),然後一共分解logn 層。
資料結構 歸併排序
排序 sort 或分類 內部排序方法可以分為五類 插入排序 選擇排序 交換排序 歸併排序和分配排序。歸併排序 include using namespace std 歸併排序中的合併演算法 void merge int a,int left,int center,int len int t int ...
資料結構 歸併排序
歸併排序,即merge sort,通過遞迴式的merge操作 merge即歸併 實現排序。演算法思想是分治思想 divide and conquer 歸併排序一般是遞迴實現的 時間複雜度o nlgn 遞迴都是一去一回,去的時候divide,回的時候conquer。表達欠提煉 1 divide,分 遞...
資料結構 歸併排序!!!
歸併排序 整體思想 將資料分成很多的部分,每次排序資料的一部分,然後將兩部分的資料進行整體排序,這樣一步一步將整體資料排序。如圖 注 將需要排序的資料進行分塊,當每個塊的資料足夠的少的時候就可以進行效率高的排序方法,當兩塊資料排序好的時候就可以將兩塊排序好的資料進行合併。具體實現方法 ifndef ...