資料結構-二路歸併-遞迴實現-C語言
阿新 • • 發佈:2018-11-27
/*
*
* 二路歸併 遞迴實現
*
*
* */
#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);
}