排序五 歸併排序

2021-08-13 10:10:43 字數 1804 閱讀 8073

寫作功底有限,不明白的推薦看一下麻省理工學院的演算法導**開課。

歸併演算法是指將兩個有序序列合併為乙個有序序列的方法。

例如,現有兩個有序序列a[1,3,5], b[2,4,6],將其合併為乙個序列c。

分別對a,b建乙個游標索引,初始值為0。

第一步比較a,b索引的值a[1,3,5],b[2,4,6],1 < 2,所以c=[1,…],      a的索引+1。

第二步比較a,b索引的值a[1,3,5],b[2,4,6],3 > 2,所以c=[1,2,…],     b的索引+1。

第三步比較a,b索引的值a[1,3,5],b[2,4,6],3 < 4,所以c=[1,2,3,…],   a的索引+1。

第四步比較a,b索引的值a[1,3,5],b[2,4,6],5 > 4,所以c=[1,2,3,4…],  b的索引+1。

第五步比較a,b索引的值a[1,3,5],b[2,4,6],5 < 6,所以c=[1,2,3,4,5…],a的索引+1。

此時a中元素已全部取完,後續只需將b中元素按次序放入c即得c[1,2,3,4,5,6]

分解:將序列分為兩組a,b,再對a,b各自分成兩組。依次類推,當每組中只有乙個元素時,可認為每個小組都是有序的。

歸併:將步驟1中分成的小組,遞迴的進行兩兩歸併,直到歸併為乙個陣列。

來自維基百科

/// 歸併,將兩個有序序列合併為乙個有序序列

///private

static

void

merge(int s, int first, int mid, int last) else

}while (i <= mid)

while (j <= last)

array.copy(temp, 0, s, first, temp.length);

}

def

merge_sort

(s):

#python

if len(s) <= 1:

return s

mid = len(s) // 2

left = merge_sort(s[:mid])

right = merge_sort(s[mid:])

#注意:並非原地排序,是新建了乙個列表並返回

return merge(left, right)

defmerge

(left, right):

result =

i = 0

j = 0

while i < len(left) and j < len(right):

if left[i] < right[j]:

i += 1

else:

j += 1

result += left[i:]

result += right[j:]

return result

五 歸併排序

歸併排序,首先需要用到遞迴,遞迴這個東西說難不難,說簡單也挺煩的。遞迴從 直觀的表現來看,就是自己呼叫自己。比如這樣 public int recursive int a 這樣就是乙個遞迴,但是問題是這樣會無線遞迴下去。所以必須給他乙個出口 public static void main strin...

排序 五 之歸併排序

歸併排序是乙個相當 穩定 的演算法對於其它排序演算法,比如希爾排序,快速排序和堆排序而言,這些演算法有所謂的最好與最壞情況。而歸併排序的時間複雜度是固定的,它是怎麼做到的?首先來看歸併排序要解決的第乙個問題 兩個有序的陣列怎樣合成乙個新的有序陣列,比如陣列1 3,5,7,8 陣列2為 1,4,9,1...

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...