源代码如下:
#include <stdio.h>
#define maxN 20
void printArray (int a[]){
int i;
for(i=0;i<13;i++)
printf("%2d ",a[i]);
printf("\n");
}
//将有二个有序数列a[first...mid]和a[mid...last]合并。
void mergeArray(int a[], int first, int mid, int last, int temp[]){
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while (i <= m && j <= n)
temp[k++] = a[i] <= a[j]?a[i++]:a[j++];
while (i <= m)
temp[k++] = a[i++];
while (j <= n)
temp[k++] = a[j++];
for (i = 0; i < k; i++)
a[first + i] = temp[i];
}
//此算法是将a[l]---a[m]和a[m+1]---a[r]两个有序的序列合并成一个有序的序列
// 此算法将第二个数组按倒序复制到赋存数组中,讲最大的元素当作观察哨, 但该算法不稳定
void merge(int a[],int l,int r, int m,int temp[]){
int i ,j,k;
for(i=m+1;i>l;i--)temp[i-1] = a[i-1];
for(j=m;j<r;j++)temp[r+m-j] = a[j+1];
for(k=0;k<r;k++)
if(temp[j]<temp[i])
a[k] = temp[j--];
else a[k] = temp[i++];
}
void mergeSort(int a[],int l,int r,int temp[]){
if(l<r){
int m = (l+r)/2;
mergeSort(a,l,m,temp);
mergeSort(a,m+1,r,temp);
mergeArray(a,l,m,r,temp);
}
}
main(){
int e[13] = {2,4,1,3,23,44,55,14,56,77,57,78,89};
int temp[13];
mergeSort(e,0,12,temp);
printArray(e);
}