核心思想:分治。
主題流程:先將乙個序列分成很多個不能再分割的子串行,將各個子串行分別排序後再將子串行合併。其實就是重複兩個步驟:分合併。
首先是第乙個小問題,怎麼分?
比如說乙個序列: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...