Python演算法(基礎) 歸併排序

2021-09-23 23:37:48 字數 2249 閱讀 6919

歸併排序原理

採用分而治之的原理:

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

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

三、直到所有子串行的長度都為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...