源代码如下:
#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); }