C语言 归并排序
归并排序采用了分治法的原理,将原先完整的数组拆分成一个一个的单独数组,然后再通过将这些单独的数组一一进行大小比较,汇聚成一个个较大的数组,最后再汇聚成一个完整的数组
这个地方需要说明的是:merge就是汇聚的过程,而mergeSort就是分治法的体现
代码可以进一步的优化,抽时间再解决吧
#include<stdio.h> #include<stdlib.h> void print(int a[],int n) { for(int i=0;i<n;i++) printf("%d\t",a[i]); } void merge(int a[],int L,int M,int R) { int left_length=M-L; int right_length=R-M+1; int *left=(int *)malloc(sizeof(int)*left_length); int *right=(int *)malloc(sizeof(int)*right_length); for(int i=L;i<M;i++) left[i-L]=a[i]; for(int i=M;i<=R;i++) right[i-M]=a[i]; int i=0,j=0,k=L; while(i<left_length&&j<right_length) { if(left[i]<right[j]) a[k++]=left[i++]; else a[k++]=right[j++]; } while(i<left_length) a[k++]=left[i++]; while(j<right_length) a[k++]=right[j++]; } void mergeSort(int a[],int L,int R) { if(L==R) return; else { int M=(L+R)/2; mergeSort(a,L,M); mergeSort(a,M+1,R); merge(a,L,M+1,R); } } int main(){ int a[8]={8,5,6,1,2,4,7,3}; int n=8; int L=0; int M=4; int R=7; mergeSort(a,L,R); print(a,n); }