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 | } |