归并排序
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 }
以上是关于归并排序的主要内容,如果未能解决你的问题,请参考以下文章