排序演算法詳解 歸併排序 Merge Sort

2021-08-13 16:00:37 字數 1988 閱讀 3185

核心思想:分治。

主題流程:先將乙個序列分成很多個不能再分割的子串行,將各個子串行分別排序後再將子串行合併。其實就是重複兩個步驟:分合併。

首先是第乙個小問題,怎麼分?

比如說乙個序列:12 ,23,1,44,233,10,9,8。我們先分成兩段:12 ,23,1,44 和 233,10,9,8,

發現還能再分成4段:12 ,23 和 1,44------233,10 和 9,8。

再分成8段:12--23--1--44 和233--10--9--8。

這時候開始把子序列進行排序合併,乙個元素就是有序的。所以不用排序。

合併成2個一組排序得到:12,23----1,44---10,233---8,9。

再合併成4個一組排序得到:1,12,23,44---8,9,10,233。

最後合併得到最終結果:1,8,9,10,12,23,44,233。

下面是分段的**,用遞迴實現。

[cpp]

view plain

copy

void

mergesort(

inta, 

intfirst, 

intlast, 

inttemp)  

}  整體思路很清晰,還差乙個小問題沒解決,怎麼合併?

現在問題就變成了怎麼合併兩個有序序列,思路是比較兩個有序序列的第乙個元素,誰小把誰放進最終序列的結尾,並把它從原來的佇列裡面刪掉直到有個序列為空。

這時候另乙個序列可能還有剩餘的資料。沒關係,因為他們本身是有序的,所以我們只要按順序把他們新增到最終序列的尾部就好了。

這樣兩個有序序列就合併成乙個有序序列了。

實現**:

[cpp]

view plain

copy

//將有二個有序數列a[first...mid]和a[mid...last]合併。把結果放到temp裡面

void

mergearray(

inta, 

intfirst, 

intmid, 

intlast, 

inttemp)  

while

(i <= m)  

temp[k++] = a[i++];  

while

(j <= n)  

temp[k++] = a[j++];  

for (int i = 0; i < k; i++)

a[first + i] = temp[i];

整體測試**:

#include#include#includeusing namespace std;

void mergearray(int a, int first,int mid,int last, int temp)

while (i <= m) temp[k++] = a[i++];

while (j <= n) temp[k++] = a[j++];

for (int i = 0; i < k; i++)

a[first + i] = temp[i];

}void mergesort(int a, int first, int last, int temp)

}void main()

, b[10] = ;

cout << "排序前陣列為:" << endl;

for (int i = 0; i < 10; i++)

cout << endl;

mergesort(a,0,9,b);

cout << "排序後陣列為:" << endl;

for (int i = 0; i < 10; i++)

cout << endl;

system("pause");

}

執行結果:

歸併排序Merge

歸併排序 歸併排序是一種基於分治法的一種排序方法。它將要排序的序列分成兩個長度相等的子串行,為每乙個子串行進行排序,然後再將子串行合併成乙個有序的序列。歸併排序 時間複雜度 o n logn 空間複雜度 o n 穩定性 穩定排序 第乙個區間 beg,mid 第二個區間 mid,end void me...

排序演算法 詳解歸併排序演算法

原理,首先將陣列遞迴的分解,直到達到終止條件返回,然後將分成兩段的陣列,進行比較,按從小到大的順序放在臨時陣列裡,然後將這一段排好順序的陣列複製給原來的陣列,繼續返回上一層,進行排序。直到完全完成遞迴。第二段結束了,第一段還有 if begin1 end1 第一段結束了,第二段還有 else 每次都...

歸併排序 完成merge方法

在工程問題中,當對大量資料進行排序的時候,資料往往是放在陣列中的。這時進行排序需要一些騰挪的技巧。一般是使用乙個臨時的陣列空間儲存中間結果,排好序以後,再拷貝回原來的陣列。package cn.itcast.sort public class mergesort data中的資料,low,mid m...