#include <iostream>
template <class T>
void Merge(T a[],T b[],int left,int mid,int right){
int i = left, j = mid+1, k = left;
while ((i <= mid) && (j <= right)) {
if (a[i] <= a[j])
b[k++] = a[i++];
else
b[k++] = a[j++];
}
if (i > mid)
for (int r=j; r<=right; r++)
b[k++] = a[r];
else
for (int r=i; r<=mid; r++) {
b[k++] = a[r];
}
}
template <class T>
void MergePass(T a[], T b[], int s, int n){
//合并大小为s的相邻子数组
int i=0;
while (i <= n - 2*s) { //合并大小为s的相邻两段子数组
Merge(a, b, i, i+s-1, i+2*s-1);
i = i+2*s;
}
if (i+s < n) //剩下的元素少于2s个
Merge(a, b, i, i+s-1, n-1);
else
for (int j=i; j<n; j++)
b[j] = a[j];
}
template <class T>
void MergeSort(T a[],int n){
T* b = new T [n];
int s=1;
while (s < n) {
MergePass(a,b,s,n);//合并到b[]中。
s += s;
MergePass(b,a,s,n);//合并到a[]中。
s += s;
}
}
int main (int argc, const char * argv[])
{
int a[] = {9,3,34,93,2,3};
int n = 6;
MergeSort(a,n);
for (int i=0; i<n; i++)
std::cout << a[i] << " ";
std::cout << std::endl;
return 0;
}