码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序

时间:2020-01-05 12:01:43      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:sort   技术   isp   sizeof   size   merge   ++   eof   one   

二路归并排序

技术图片
 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

归并排序

标签:sort   技术   isp   sizeof   size   merge   ++   eof   one   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!