主要思想:不斷將已經有序的子陣列a[p..q]和a[q+1..r]合併為新的有序的陣列a[p..r]。具體過程可如下操作:
分解:將n個元素分成各含n/2個元素的子串行;
解決:對兩個子陣列遞迴地排序;
合併:合併兩個已經有序的子陣列得到最終的有序陣列。
**://合併/歸併排序——分治策略
#include #include using namespace std;
void merger(vector&data,int p,int q,int r);
void merger_sort(vector&data,int p,int r);
int main()
//顯示需要排序的資料
cout<<"the set of data show as:"<&data,int p,int q,int r)
{ //將有序的data[p...q]與data[q+1...r]排序為有序的data[p...r]
vectordata_left;
vectordata_right;
for(int i=p;i<=q;i++)
data_left.push_back(data[i]);
for(int i=q+1;i<=r;i++)
data_right.push_back(data[i]);
int k=p,i=0,j=0;
for(;(i&data,int p,int r)
{ if(p時間複雜度:
分解:僅計算子陣列的中間位置,d(n)=o(1);
解決:遞迴分解問題,時間為2t(n/2);
合併:o(n)。
因此,t(n)=o(1)+2t(n/2)+o(n)=o(nlogn) (遞迴樹共logn+1層,每一層都是cn)。
合併排序演算法
陣列ary的m個元素,ary p ary q ary q 1 ary r 已按曾序排序 使得ary p ary r 按曾序排列 void clibrary merge int ary,int p,int q,int r,int m else k 0 for i p i r i ary i bp k ...
合併排序演算法
合併排序是用分治策略實現的排序演算法之一。基本思想是 將待排序的元素分成大小大致相同的兩個子集合,分別對這兩個子集合進行排序,最後將排好序的子集合合併成所需要的集合。此方法的時間複雜度t n o nlogn 這種排序方法漸進最優演算法。合併排序 遞迴 include using namespace ...
合併排序演算法
合併排序演算法就是將多個有序資料表合併成乙個有序資料表。如果參與合併的只有兩個有序表,則稱為二路合併。排序流程 原始資料 67 65 77 38 97 3 33 49 34 第一遍 65 67 38 77 3 79 33 49 34 第二遍 38 65 67 77 3 33 49 97 34 第三遍...