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

来源:互联网 发布:数据分析师前景如何 编辑:程序博客网 时间:2024/06/05 00:24
/* * * 二路归并 递归实现 * * * */#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);}
原创粉丝点击