用C语言实现归并排序

1. [代码][C/C++]代码     跳至 [1] [全屏预览]

01 #include<stdio.h>
02 #include<stdlib.h>
03 #include<time.h>
04 #include<stdlib.h>
05 #define random(i) (rand()%i)
06 #define N   12
07 #define INFINITY 99999999
08  
09  
10 //要排序的数存放在a数组汇总,p,q,r是数组下标
11 void Merge(int *a,int p,int q,int r)
12 {
13     int n1=q-p+1;
14     int n2=r-q;
15     int *L=(int *)malloc(sizeof(int)*n1);
16     int *R=(int *)malloc(sizeof(int)*n2);
17     int i,j,k;
18     int m=0;
19     if(L==NULL)
20     {
21         printf("申请空间失败\n");
22     }
23     if(R==NULL)
24     {
25         printf("申请空间失败\n");
26     }
27     for(i=0;i<n1;i++)
28     {
29         L[i++]=a[p+i];
30         i--;
31     }
32          
33     for(j=0;j<n2;j++)
34     {
35         R[j++]=a[q+j+1];
36         j--;
37     }
38          
39     L[n1]=INFINITY;         //设置哨兵
40     R[n2]=INFINITY;
41     i=0;
42     j=0;
43     for(k=p;k<=r;k++)
44     {
45         if(L[i]<=R[j])
46         {
47             a[k]=L[i];
48             i++;
49         }
50         else
51         {
52             a[k]=R[j];
53                 j++;
54         }
55      
56     }
57      
58 }
59  
60 void merge_sort(int *A,int p,int r)
61 {
62     int q;
63     if(p<r)
64     {
65         q=(p+r)/2;
66         merge_sort(A,p,q);
67         merge_sort(A,q+1,r);
68         Merge(A,p,q,r);
69     }
70      
71  
72 }
73  
74 void main()
75 {
76     int rand_no=0;
77     int i=0;
78     int j=0;
79     int a[N];                   //n表示数组长度
80     srand((int)time(0));        //设置随机数种子
81     printf("==================排序前==========================");
82     printf("\n");
83     for(rand_no=0;rand_no<N;rand_no++)
84     {
85  
86         a[rand_no]=random(100);
87         printf("%5d",a[rand_no]);
88          
89     }
90      
91     printf("\n");
92     merge_sort(a,0,N);
93     printf("==================排序后==========================");
94  
95     printf("\n");
96     for(i=1;i<=N;i++)
97         printf("%5d",a[i]);
98     printf("\n");      
99 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值