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

Posted 吴云龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础算法 分治法之合并排序相关的知识,希望对你有一定的参考价值。

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

 

 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 }  

 

以上是关于基础算法 分治法之合并排序的主要内容,如果未能解决你的问题,请参考以下文章

分治法之快排&随机化

分治算法的完美使用----归并排序

算法基础-归并排序

算法4:合并排序的套路 | 重用 | 分治

分治算法——合并排序与自然排序

分治算法