归并排序

Posted hqx-curiosity

tags:

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

二路归并排序

技术图片
 1 //二路归并排序
 2 //分治法
 3 //自底向上的二路归并排序算法
 4 #include<stdio.h>
 5 #include<malloc.h>
 6 void disp(int a[],int n){
 7     int i;
 8     for(i=0;i<n;i++)
 9         printf("%d ",a[i]);
10     printf("
");
11 }
12 void Merge(int a[],int low,int mid,int high){
13     //将a[low..mid]和a[mid+1..high]两个相邻的有序子序列归并为一个有序子序列a[low..high] 
14     int *tmp;
15     int i = low,j = mid+1,k = 0;
16     tmp = (int *)malloc((high - low + 1)*sizeof(int));
17     while(i < mid && j < high){
18         if(a[i] <= a[j]){
19             tmp[k] = a[i];
20             i++;
21             k++;
22         }
23         else{
24             tmp[k] = a[j];
25             j++;
26             k++;
27         }
28     }    
29     while(i <= mid){
30         tmp[k] = a[i];
31         i++;
32         k++;
33     }
34     while(j <= high){
35         tmp[k] = a[j];
36         j++;
37         k++;
38     }
39     for(k = 0,i = low;i<=high;k++,i++)
40         a[i] = tmp[k];
41     free(tmp);
42 }
43 void MergePass(int a[],int length,int n){    //进行一趟二路归并排序 
44     int i;
45     for(i=0;i+2*length-1 < n;i = i+2*length)
46         Merge(a,i,i+length-1,i+2*length-1);
47     if(i+length-1 < n)
48         Merge(a,i,i+length-1,n-1); 
49 }
50 void MergeSort(int a[],int n){
51     int i; 
52     for(int i = 1;i<n;i = 2*i)
53         MergePass(a,i,n);
54 }
55 int main(){
56     int n = 10;
57     int a[] = {2,5,1,7,10,6,9,4,3,8};
58     printf("排序前:");
59     disp(a,n);
60     MergeSort(a,n);        //二路归并算法 
61     printf("排序后:");
62     disp(a,n);
63     return 0; 
64 } 
View Code

以上是关于归并排序的主要内容,如果未能解决你的问题,请参考以下文章

python代码实现归并排序(Merge Sort )

排序之外部排序

Python代码实现归并排序

Python代码实现归并排序

算法排序02——归并排序介绍及其在分治算法思想上与快排的区别(含归并代码)

排序算法之归并排序