感觉还不错哈,借鉴别人的做法自己打出来的,总算有个清晰的思路了~~~
1 #include<stdio.h> 2 #include<stdlib.h> 3 void Merge(int *a,int low,int mid,int high) 4 { /*将下标为[low,mid]和[mid+1,high]的有序区间合并成下标为[low,high]的有序区间*/ 5 6 int i=low; /*i用来遍历[low,mid]*/ 7 int j=mid+1; /*j用来遍历[mid+1,high]*/ 8 int p=0; /*p用来遍历辅助数组*/ 9 10 /*申请辅助内存,用来保存排序好的[low,high]区间状态*/ 11 int *sort=(int *)malloc((high-low+1)*sizeof(int)); 12 13 if(!sort)return;/*申请内存失败*/ 14 /******************************划重点***********************************/ 15 /* 两个子区间下标为i和j的元素进行比较 16 较小的存放到辅助数组中 17 直到其中某一个区间遍历到结尾 */ 18 while(i<=mid&&j<=high) 19 sort[p++]=a[i]<a[j]?a[i++]:a[j++]; 20 21 /*区间[mid+1,high]先到达结尾,将区间[low,mid]剩下部分存放到辅助数组中*/ 22 while(i<=mid) 23 sort[p++]=a[i++]; 24 25 /*区间[low,mid]先到达结尾,与上面情况同理*/ 26 while(j<=high) 27 sort[p++]=a[j++]; 28 /******************************划重点***********************************/ 29 /*上面三个循环已经将排好序的[low,high]区间状态记录下来,最后复制回原区间即可*/ 30 while(p--) 31 a[low+p]=sort[p]; 32 } 33 void MergeSort(int *a,int low,int high) 34 { 35 if(low<high) 36 { 37 int mid=(low+high)/2; /*把区间[low,high]分成两部分*/ 38 39 MergeSort(a,low,mid); /* 又把这两部分 */ 40 MergeSort(a,mid+1,high);/* 分别调用排序 */ 41 42 Merge(a,low,mid,high); /*上面两部分排序完成之后进行合并得到一个有序区间啦*/ 43 } 44 } 45 /*下面部分是测试结果*/ 46 int main() 47 { 48 int i,a[]={1,5,3,2,1,3,5,9,4,6,8,7}; 49 int n=sizeof(a)/sizeof(int); 50 MergeSort(a,0,n-1); 51 for(i=0;i<n;i++) 52 printf("%d ",a[i]); 53 }
输出:1 1 2 3 3 4 5 5 6 7 8 9
哈哈,代码打的很菜。