第1关 归并排序的递归算法
#include <iostream>
using namespace std;
#include <stdio.h>
#include<stdlib.h>
void input(int *&a,int & n);
void output(int *a,int n);
void Merge(int a[],int s,int m, int e);
void MergeSort(int a[],int s,int e);
int main()
{
int i,n;
int *a = NULL;
input (a,n);
MergeSort (a,0,n-1) ;
output(a,n);
free(a);
return 0;
}
/**********定义函数**********/
/********** Begin **********/
void input(int *&a,int &n){
scanf("%d",&n);
a = (int*)malloc(sizeof(int)*(n));
if(!a)
return ;
for(int i = 0; i < n; i++)
scanf("%d",&a[i]);
}
void output(int *a,int n){
for(int i = 0; i < n; i++)
printf("%d ",a[i]);
printf("\n");
}
void Merge(int a[],int s,int m, int e){
int i = s,j = m+1,k = 0;
int *b = (int*)malloc(sizeof(int)*(e-s+1));
while(i <= m&&j<=e){
if(a[i]<a[j]){
b[k++] = a[i++];
}else{
b[k++] = a[j++];
}
}
while(i <= m)
b[k++] = a[i++];
while(j <= e)
b[k++] = a[j++];
for(i = 0; i < k; i++)
a[s+i] = b[i];
free(b);
}
void MergeSort(int a[],int s,int e){
if(a==NULL || s >= e)
return ;
int mid = (s+e)/2;
printf("%d,%d,%d\n",s,e,mid);
MergeSort(a,s,mid);
MergeSort(a,mid+1,e);
Merge(a,s,mid,e);
}
/********** End **********/
第2关 归并排序的非递归算法
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void input(int *&a,int & n);
void output(int *a,int n);
void Merge(int a[],int low,int mid,int high);
void MergePass(int a[],int length,int n); //一趟二路归并排序
void MergeSort(int a[],int n); //二路归并算法
int main ()
{
int i,n,m;
int *a = NULL;
input (a,n);
MergeSort (a,n) ;
output(a,n);
free(a);
return 0;
}
/**********定义函数**********/
/********** Begin **********/
void input(int *&a,int & n){
scanf("%d",&n);
a = (int*)malloc(sizeof(int)*n);
if(!a)
return;
for(int i = 0; i < n; i++)
scanf("%d",&a[i]);
}
void output(int *a,int n){
for(int i = 0; i < n; i++){
printf("%d ",a[i]);
}
printf("\n");
}
void Merge(int a[],int low,int mid,int high){
int i = low,j = mid+1,k=0;
int *b = (int*)malloc(sizeof(int)*(high-low+1));
while(i<=mid&&j<=high){
if(a[i]<=a[j]){
b[k++] = a[i++];
}else{
b[k++] = a[j++];
}
}
while(i<=mid)
b[k++] = a[i++];
while(j<=high)
b[k++] = a[j++];
for(int i = 0 ; i < k;i++)
a[low+i] = b[i];
free(b);
}
void MergePass(int a[],int length,int n){
int low = 0,mid,high;
while(length+low-1 < n){
mid = low + length - 1;
high = mid + length;
if(high >= n)
high = n - 1;
Merge(a,low,mid,high);
printf("%d,%d,%d\n",low,high,mid);
low = high + 1;
}
} //一趟二路归并排序
void MergeSort(int a[],int n){
for(int i = 1; i < n; i*=2)
MergePass(a,i,n);
} //二路归并算法
/********** End **********/