合併排序是用分治策略實現對n 個元素進行排序的演算法。其基本思想是,將待排序元素分成大小大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排好序的子集合合併成所要求的排好序的集合。
其遞迴描述如下:
#include #define n 8
typedef int type;
using namespace::std;
type *b = new type[n];
void mergesort(type a, int left, int right);
void merge(type a, type b, int left, int i, int right );
void mergesort(type a, int left, int right)
}void merge(type a, type b, int left, int i, int right )
while(x <= i) b[k++] = a[x++];
while(y <= right) b[k++] = a[y++];
for(int i = left; i < k; i++)
a[i] = b[i];
}int main()
; mergesort(a, 0, 7);
for(int i = 0; i < n; i++)
cout << a[i] << ',';
cout << endl;
return 1;
}
消去遞迴的合併演算法如下:
#include typedef int type;
using namespace::std;
void merge(type c, type d, int l, int m, int r)
if(i > m) for(int q = j; q <= r; q++) d[k++] = c[q];
else for(int q = i; q <= m; q++) d[k++] = c[q];
}void mergepass(type x, type y, int s, int n)
if(i + s < n) merge(x, y, i, i+s-1, n-1);
else for(int j = i; j <= n-1; j++) y[j] = x[j];
}void mergesort(type a, int n)
}int main()
; mergesort(num, 8);
for(int j = 0; j < 8; j++)
cout << num[j];
int i;
cin >> i;
return 1;
}
自然合併排序如下:
#include #define n 8
typedef int type ;
using namespace::std;
void mergesort_natural(type a, int n);
int scan(type a, type b, int n);
void merge(type a, type b, int left , int mid, int right);
//自然歸併排序
void mergesort_natural(type a, int n)
}/* 線性掃瞄數列,如果存在逆序的情況就進行合併排序
否則返回乙個為零的中間值mid
*/ int scan(type a, type b, int n)
} } // 當最後乙個組為最後乙個數的極端情況
if((mid !=0) && (right != 0))
merge(a, b, left , mid, right);
return mid;
}void merge(type a, type b, int left , int mid, int right)
while(i <= mid) b[k++] = a[i++];
while(j <= right) b[k++] = a[j++];
}int main()
; mergesort_natural(a, 8);
for(int i = 0; i < n; i++)
cout << a[i] << ',';
cout << endl;
// int i;
// cin >> i;
return 1;
}
合併排序的乙個弊端就是額外需要儲存器的空間配置,在實際上的實現上,會極度影響速度和快取記憶體的效能!
合併排序演算法
陣列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 ...
合併排序演算法
主要思想 不斷將已經有序的子陣列a p.q 和a q 1.r 合併為新的有序的陣列a p.r 具體過程可如下操作 分解 將n個元素分成各含n 2個元素的子串行 解決 對兩個子陣列遞迴地排序 合併 合併兩個已經有序的子陣列得到最終的有序陣列。合併 歸併排序 分治策略 include include u...
合併排序演算法
合併排序是用分治策略實現的排序演算法之一。基本思想是 將待排序的元素分成大小大致相同的兩個子集合,分別對這兩個子集合進行排序,最後將排好序的子集合合併成所需要的集合。此方法的時間複雜度t n o nlogn 這種排序方法漸進最優演算法。合併排序 遞迴 include using namespace ...