4.8 合并排序法

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 }

 

转载于:https://www.cnblogs.com/wozixiaoyao/p/5683164.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值