/************************************ --修改日期: 2009.5.29 --修改人: 吴强 --修改原因: 从前写的代码不够规范 --输入要求: 无 ************************************/ #include #include #define N 20 main() { int i; int iArr[N]={2, 5, 4, 3, 6, 11, 23, 42, 13, 16, 32, 12, 31, 52, 34, 25, 42, 34, 22,33 }; void MergeSort(int iArr[]); void MergePass(int iArr[], int len); void Merge(int iArr[], int low, int m, int high); void MergeSortDC(int iArr[], int low, int high); // MergeSortDC(iArr, 0, N-1); MergeSort(iArr); for (i= 0; i< N; i++) { printf("%d,",iArr[i]); } printf("/n"); } //递归方法实现 void MergeSortDC(int iArr[], int low, int high) { int m; /*顶和底下标相同则退出*/ if (low< high) { m=(low+high-1)/2; /*用递归从顶找到低,然后从低在归并会顶*/ MergeSortDC(iArr, low, m); MergeSortDC(iArr, m+1, high); Merge(iArr, low, m, high); } } void Merge(int iArr[],int low ,int m,int high) { int i=low; int j=m+1; int k=0; int *p; /*利用一空间记录排序好的俩文件,最后付给iArr */ p=(int *)malloc( (high-low+1)*sizeof(int) ); if (!p) { printf("error"); exit(0); } /*俩个文件比较排序*/ while (i<= m && j<= high) { p[k++]=iArr[i]< iArr[j]? iArr[i++]:iArr[j++]; } while (i<= m) { p[k++]=iArr[i++]; } while (j<=high) { p[k++]=iArr[j++]; } /*排序好的P付给iArr*/ for (i=low,k=0; i<= high; i++,k++) { iArr[i]=p[k]; } } //非递归方法实现 /*2路归并-自底向上 算法*/ void MergeSort(int iArr[]) { int i; /*i为数据归并的长度*/ for (i=1; i< N; i*=2) { MergePass(iArr, i); } } void MergePass(int iArr[], int len) { int i; for (i=0; i+2*len-1< N; i+=2*len) { /*归并|i、i+len-1为第一有序文件头,尾下标*/ Merge(iArr, i, i+len-1, i+2*len-1); } /*如果存在俩个长度不足够的,就归并他们*/ if (i+len-1< N) { /*n-1为最后一个元素下标*/ Merge(iArr, i, i+len-1, N-1); } }