基础算法 分治法之合并排序

思想: 合并排序算法的分治策略是将待排序元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。

 1 #include <stdio.h>  
 2    
 3 void merge(int a[],int p,int q,int r)  
 4 {  
 5     int n1=q-p+1,n2=r-q;  
 6     int b1[n1];  
 7     int b2[n2];  
 8     int i=0,j=0,temp1=p,temp2=q;  
 9     while(p<=q)  
10     {  
11         b1[i]=a[p];  
12         ++i;  
13         ++p;  
14     }  
15     while(q+1<=r)  
16     {  
17         b2[j]=a[q+1];  
18         ++j;  
19         ++q;  
20     }  
21    
22     p=temp1;q=temp2;  
23     i=0,j=0;  
24     while(p<=r)  
25     {  
26         if(i==n1)           
27         {  
28             a[p]=b2[j];  
29             ++j;  
30         }  
31         else if(j==n2)  
32         {  
33             a[p]=b1[i];  
34             ++i;  
35         }  
36        
37         else if(b1[i]<b2[j])  
38         {  
39             a[p]=b1[i];  
40             ++i;  
41         }  
42         else  
43         {  
44             a[p]=b2[j];  
45             ++j;  
46         }  
47         ++p;  
48     }  
49 }  
50    
51 void merge_sort(int a[],int p,int r)  
52 {  
53     int q=0;  
54     if(p<r)  
55     {  
56         q=(p+r)/2;  
57         merge_sort(a,p,q);   
58         merge_sort(a,q+1,r);  
59         merge(a,p,q,r);  
60     }  
61 }  
62    
63 int main()  
64 {  
65     int i, a[100];  
66     srand(time(0));  
67     for ( i = 1; i < 101; ++i ){  
68         a[i-1] = rand() % 1001;  
69         printf( "%3d ", a[i-1] );  
70         if(i%15==0) printf("
");   
71     }  
72     printf("

");  
73     SelectionSort(a, 100);  
74     for ( i = 1; i < 101; ++i ){  
75         printf( "%3d ", a[i-1] );  
76         if(i%15==0) printf("
");   
77     }  
78     getch();  
79     return 0;  
80 }  
原文地址:https://www.cnblogs.com/lt132024/p/6166203.html