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