递归实现
const int maxn = 110;
void merge(int a[], int l1, int r1, int l2, int r2){
int i = l1, j = l2;
int temp[maxn], index = 0;
while(i <= r1 && j <= r2){
if(a[i] <= a[j]){
temp[index++] = a[i];
i++;
}
else{
temp[index++] = a[j];
j++;
}
}
while(i <= r1) temp[index++] = a[i++];
while(j <= r2) temp[index++] = a[j++];
for(int i = 0; i < index; i++){
a[l1+i] = temp[i];
}
}
void mergesort(int a[],int left,int right){
if(left < right){
int mid = (left + right) / 2;
mergesort(a, left, mid);
mergesort(a, mid + 1, right);
merge(a, left, mid, mid+1, right);
}
}
非递归实现
void mergesort(int a[]){
for(int step = 2; step / 2 <= n; step *= 2){
for(int i = 1; i <= n; i += step){ //对每一组
int mid = i + step / 2 - 1;
if(mid + 1 <= n){ //右子区间存在元素则合并
merge(a, i, mid, mid + 1, min(n, i + step - 1));
}
}
}
}
//如果题目要求给出归并排序每一趟结束时的序列,也可以用sort
void mergesort(int a[]){
for(int step = 2; step / 2 <= n; step *= 2){
for(int i = 1; i <= n; i += step){
sort(a+i, a+min(i+step, n+1)); //尾元素的后一个
}
}
//在这里打印
}
}