歸併排序原理
採用分而治之的原理:
一、將乙個序列從中間位置分成兩個序列;
二、在將這兩個子串行按照第一步繼續二分下去;
三、直到所有子串行的長度都為1,也就是不可以再二分截止。這時候再兩兩合併成乙個有序序列即可。
一圖以明之
兩種實現方式:
一、
def merge(a, b):
c =
h = j = 0
while j < len(a) and h < len(b):
if a[j] < b[h]:
j += 1
else:
h += 1
if j == len(a):
for i in b[h:]:
else:
for i in a[j:]:
return c
def merge_sort(lists):
if len(lists) <= 1:
return lists
middle = len(lists)//2
left = merge_sort(lists[:middle])
right = merge_sort(lists[middle:])
return merge(left, right)
if __name__ == '__main__':
a = [14, 2, 34, 43, 21, 19]
print (merge_sort(a))
二、
def mergesort(alist):
print("splitting ", alist)
if len(alist) > 1:
mid = len(alist) // 2
lefthalf = alist[:mid]
righthalf = alist[mid:]
mergesort(lefthalf)
mergesort(righthalf)
i = 0
j = 0
k = 0
print('alist',alist)
while i < len(lefthalf) and j < len(righthalf):
print('one',len(lefthalf),len(righthalf))
if lefthalf[i] < righthalf[j]:
alist[k] = lefthalf[i]
i = i + 1
print('one', alist)
else:
alist[k] = righthalf[j]
j = j + 1
print('one1', alist)
k = k + 1
while i < len(lefthalf):
print('two', len(lefthalf), len(righthalf))
alist[k] = lefthalf[i]
i = i + 1
k = k + 1
print('two', alist)
while j < len(righthalf):
print('three', len(lefthalf), len(righthalf))
alist[k] = righthalf[j]
j = j + 1
k = k + 1
print('three', alist)
print("merging ", alist)
alist = [54,26,93,17,77,31,44,55,20]
mergesort(alist)
print(alist)
首先,列表被分成兩半。我們已經計算過(在二分查詢中)將列表劃分為一半需要 log^n 次,其中 n 是列表的長度。第二個過程是合併。列表中的每個項將最終被處理並放置在排序的列表上。因此,大小為 n 的列表的合併操作需要 n 個操作。此分析的結果是 logn 的拆分,其中每個操作花費n,總共 nlogn 。歸併排序是一種 o(nlogn) 演算法。 演算法基礎 歸併排序
1.演算法描述 把原始的陣列分成若干的子陣列,對每乙個子陣列進行排序 繼續把子陣列與子陣列合併,合併後仍然有序,直到全部合併完成,形成有序的陣列。2.演算法實現 2.1.合併子陣列 param unsorted the unsorted array param first the start ind...
演算法基礎 歸併排序
歸併排序即將目標陣列分成n個最小的組 相鄰的2個數字 並將這些最小子陣列排序,依次合併相鄰的子陣列,最後各自有序的子陣列將會合併成完全有序的陣列。這將需要用到遞迴思想。static class mergesort private static void merge int a,int start,i...
基礎演算法 歸併排序
def merge arr 這個函式是先把陣列進行分割,一直分,最後分成乙個數來呼叫第二個函式mergesort進行比較 如果陣列只有乙個數,直接就返回 if len arr 1 return arr mid len arr 2 left arr merge arr mid right arr me...