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

4.8 合并排序法

时间:2016-07-19 09:07:11      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

4-8 MergeSort.c

 1 #include <stdio.h>
 2 #include "4-1 CreateData.c"    //生成随机数的函数
 3 #define ARRAYLEN 10    //需要排序的数据元素数量
 4 void MergeStep(int a[],int r[],int s,int m,int n) //相邻有序段合并 
 5 {
 6     int i,j,k;
 7     k=s;
 8     i=s;
 9     j=m+1;
10     while(i<=m && j<=n) //当两个有序表都未结束时,循环比较 
11     {
12         if(a[i]<=a[j]) //当较小的元素复制到R中 
13             r[k++]=a[i++];
14         else
15             r[k++]=a[j++];
16     }
17     while(i<=m) //将未合并的部分复制到R中 
18         r[k++]=a[i++];
19     while(j<=n)
20         r[k++]=a[j++]; //将未合并的部分复制到R中 
21 }
22 void MergePass(int a[],int r[],int n,int len) //完成一遍合并的函数 
23 {
24     int s,e;
25     s=0;
26     while(s+len<n) //至少有两个有序段 
27     {
28         e=s+2*len-1;
29         if(e>=n) //最后一段可能少于len个结点 
30             e=n-1;
31         MergeStep(a,r,s,s+len-1,e); //相邻有序段合并 
32         s=e+1; //下一对有序段中左段的开始下标 
33     }
34     if(s<n) //还剩一个有序段,将其从A中复制到R中 
35         for(;s<n;s++)
36             r[s]=a[s];
37 }
38 void MergeSort(int a[],int n)
39 {
40     int *p;
41     int len=1;     //有序序列的长度 
42     int f=0;    //变量f作标志
43     if(!(p=(int *)malloc(sizeof(int)*n)))    //分配内存空间,保存临时数据
44     {
45         printf("分配临时内存失败!\n");
46         exit(0); 
47     }
48     while(len<n)
49     {
50         if(f)   //交替地在A和P之间来回合并 
51             MergePass(p,a,n,len);    //调用MergePass,对p合并到a
52         else
53             MergePass(a,p,n,len);    //调用MergePass,对a合并到p
54         len*=2;    //增加有序序列长度
55         f=1-f; //使f值在0和1之间切换 
56     }
57     if(f)    //若进行了排序
58         for(f=0;f<n;f++)    //将数组p中的数据复制到数组a
59             a[f]=p[f];
60     free(p); //释放分配的内存 
61 }
62 
63 int main()
64 {
65     int i,a[ARRAYLEN];    //定义数组
66     for(i=0;i<ARRAYLEN;i++)    //清空数组
67         a[i]=0;
68     if(!CreateData(a,ARRAYLEN,1,100))    //判断生成随机数是否成功
69     {
70         printf("生成随机数不成功!\n");
71         getch();
72         return 1;
73     }
74     printf("原数据:");     //输出生成的随机数
75     for(i=0;i<ARRAYLEN;i++)
76         printf("%d ",a[i]);
77     printf("\n");
78     MergeSort(a,ARRAYLEN);    //调用合并排序函数
79     printf("排序后:"); 
80     for(i=0;i<ARRAYLEN;i++)    //输出排序后的结果
81         printf("%d ",a[i]);
82     printf("\n");
83     getch();
84     return 0;   
85 }

 

4.8 合并排序法

标签:

原文地址:http://www.cnblogs.com/wozixiaoyao/p/5683164.html

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