所谓的归并排序,就是递归“把数组从中间分开,分成两段,然后分别排序,最后合并”这个过程。
比较好理解,所以很快敲出了代码。
比快排好理解。。。个人感觉。。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 #include<stdio.h> #include<stdlib.h> typedef int mytype; void add(mytype *a,int l1,int h1,int l2,int h2) { mytype *t; int i,j,k; i=l1; j=l2; k=0; t=(mytype*)malloc((h2-l1+1)*sizeof(mytype)); //申请空间存放中间数据 while(i<=h1&&j<=h2) { if(a[i]<a[j]) { t[k++]=a[i++]; }else { t[k++]=a[j++];//小的放进去。。。 } } while(i<=h1) { t[k++]=a[i++]; } while(j<=h2) t[k++]=a[j++];//多余的数 for(i=l1,j=0;i<=h2;i++,j++) { a[i]=t[j];//复制中间数据回去 } free(t); return ; } void MergeSort(mytype *a,int low,int high) { int mid=(low+high)/2; if(low<high) { MergeSort(a,low,mid);//最难理解的部分了吧。。。 MergeSort(a,mid+1,high);//就是不断的递归 add(a,low,mid,mid+1,high);//然后从最底一层排序后回溯上来。。。 } return ; } int main() { mytype s[100]; int i,j,k,n; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) { scanf("%d",s+i); } MergeSort(s,0,n-1); for(i=0;i<n;i++) { printf("%d ",s[i]); } puts(""); } }
归并排序,比较好理解的一种排序
发表评论
引用:0
- 下面所列的是引用到本博客的链接
- 归并排序,比较好理解的一种排序 来自 混沌的云
