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);
}