码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序

时间:2017-12-11 00:46:42      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:数组   amp   ++   测试   辅助   malloc   比较   void   class   

感觉还不错哈,借鉴别人的做法自己打出来的,总算有个清晰的思路了~~~

 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

 

哈哈,代码打的很菜。

 

归并排序

标签:数组   amp   ++   测试   辅助   malloc   比较   void   class   

原文地址:http://www.cnblogs.com/kang000/p/8018571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!