1. 程式人生 > >資料結構-二路歸併-遞迴實現-C語言

資料結構-二路歸併-遞迴實現-C語言

/*
 *
 * 二路歸併 遞迴實現
 *
 *
 * */

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