int merge(int a[],int low,int mid,int high)
{
int *tmp;
int i=low,j=mid+1;
int k=0;
tmp=(int*)malloc(high-low+1*sizeof(int));
while(i<=mid&&j<=high){
if(a[i]<a[j]){
tmp[k]=a[i];
i++;k++;
}
else{
tmp[k]=a[j];
j++;k++;
}
}
while(i<=mid){
tmp[k]=a[i];
k++;i++;
}
while(j<=high){
tmp[k]=a[j];
j++;k++;
}
for(k=0,i=low;i<=high;i++,k++){
a[i]=tmp[k];
}
free(tmp);
}
//将有序数组a[]和b[]合并到c[]中
void MemeryArray(int a[], int n, int b[], int m, int c[])
{
int i, j, k;
i = j = k = 0;
while (i < n && j < m)
{
if (a[i] < b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
}
while (i < n)
c[k++] = a[i++];
while (j < m)
c[k++] = b[j++];
}
自顶向下:
void sort(int a[],int low,int high)
{
int mid;
if(low<high){
mid=(low+high)/2;
sort(a,low,mid);
sort(a,mid+1,high);
merge(a,low,mid,high);
}
}
自底向上:
void pass(int a[],int length,int n)
{
int i;
for(int i=1;i+2*length<n;i=i+2*length){
merge(a,i,i+length,i+2*length);
}
if(i+length<n){
merge(a,i,i+length,n);
}
}
void sort(int a[],int n)
{
for(int i=1;i<n;i=i*2){
pass(a,i,n);
}
}
归并排序相对于快速排序来说稍微复杂一点,merge合并两个数组。