数据结构-二路归并-递归实现-C语言

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cyzyfs/article/details/78152235
/*
 *
 * 二路归并 递归实现
 *
 *
 * */

#include <stdio.h>
#include <stdlib.h>

//对一个元素或者多个有序元素进行合并
void Merge(int Element[],int TmpA[],int L,int R,int RightEnd){
    int LeftEnd,NumElements,Tmp;
    LeftEnd=R-1;
    Tmp=L;
    NumElements=RightEnd-L+1;
    while (L<=LeftEnd&&R<=RightEnd){
        if(Element[L]<Element[R])TmpA[Tmp++]=Element[L++];
        else TmpA[Tmp++]=Element[R++];
    }
    while (L<=LeftEnd)TmpA[Tmp++]=Element[L++];
    while (R<=RightEnd)TmpA[Tmp++]=Element[R++];
    for(int i=0;i<NumElements;i++,RightEnd--)Element[RightEnd]=TmpA[RightEnd];
}

//核心递归排序函数
//思路:递归致一个元素,然后对每一层进行归并排序,
void Msort(int A[],int TmpA[],int L,int RightEnd){
    int Center;
    if(L<RightEnd){
        Center=(L+RightEnd)/2;
        Msort(A,TmpA,L,Center);
        Msort(A,TmpA,Center+1,RightEnd);
        Merge(A,TmpA,L,Center+1,RightEnd);
    }
}


//优化接口函数
void MergeSort(int A[],int N){
    int * TmpA;
    TmpA=(int *)malloc(N*sizeof(int));
    if(TmpA!=NULL){
        Msort(A,TmpA,0,N-1);
        free(TmpA);
    }
    else{
        printf("空间不足!");
    }

}
void showArr(int arr[],int N){
    for(int i=0;i<N;i++){
        printf("%d\t",arr[i]);
    }
    printf("\n");
}
int main(){
    int arr5[5]={4,2,1,7,9};
    int arr6[6]={7,4,2,1,9,7};
//    int c[10]={11,13,15,17,19,2,4,6,8,20};
//    int temp[10];
//    Merge(c,temp,0,5,9);
//    showArr(c,10);
    MergeSort(arr5,5);
    MergeSort(arr6,6);
    showArr(arr5,5);
    showArr(arr6,6);

}

猜你喜欢

转载自blog.csdn.net/cyzyfs/article/details/78152235