首页 > 编程语言 > 详细

归并排序

时间:2020-01-05 11:55:32      阅读:88      评论:0      收藏:0      [点我收藏+]

二路归并排序

技术分享图片
 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("\n");
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

归并排序

原文:https://www.cnblogs.com/Hqx-curiosity/p/12151767.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!