首页 > 代码库 > 基础算法 分治法之合并排序

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

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

 

 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("\n");   
71     }  
72     printf("\n\n");  
73     SelectionSort(a, 100);  
74     for ( i = 1; i < 101; ++i ){  
75         printf( "%3d ", a[i-1] );  
76         if(i%15==0) printf("\n");   
77     }  
78     getch();  
79     return 0;  
80 }  

 

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