1. 程式人生 > >資料結構-二路歸併-練習題1

資料結構-二路歸併-練習題1

題目

1.一個長度為L(L≥1)的升序序列S,處在個位置的數為S的中位數。例如,若序列S1=(11,13,15,17,19),則S1的中位數是15,。兩個序列的中位數是含它們所有元素的升序序列的中位數。例如,若S2=(2,4,6,8,20),則S1和S2的中位數是11。現有兩個等長升序序列A和B,試設計一個時間和空間兩方面儘可能高效的演算法,找出兩個序列A和B的中位數。

程式碼實現 (時間複雜度 log2(n))

#include <stdio.h>

int getArrMid(int a[],int b[],int s1,int e1,int
s2,int e2){ int m1=(s1+e1)/2; int m2=(s2+e2)/2; if(a[m2]==b[m1]){ return a[m1]; } else if(s1==m1){ return (a[m1]>b[m2]?a[m1]:b[m2]); } else if(a[m1]<b[m2]){ return getArrMid(a,b,m1+1,e1,s2,m2-1); } else if(a[m1]>b[m2]){ return
getArrMid(a,b,s1,m1-1,m2+1,s2); } } int main(){ int a[]={7,6,5,4,3}; int b[]={20,4,3,2,1}; int i=getArrMid(a,b,0,4,0,4); printf("a_b_Mid=%d",i); }

結果

結果

程式碼實現(錯誤示範 時間複雜度 nlog2(n)

/*
 *
 * 第一題
 *
 *
 * */

#include <stdio.h>

int main() {

/*
 *
 * 二路歸併 之 有序數組合並
 *
 * a={11,13,15,17,19}
 * b={2,4,6,8,20}
 * c=a+b={11,13,15,17,19,2,4,6,8,20}
 * 對c陣列進行排序
 *
 *
 * */
int c[10]={2,4,6,8,20,11,13,15,17,19}; //準備工作 int L=0,R=5;//左起始點 右起始點 int RightEnd=9;//右終止點 int LeftEnd=R-1;//左終止點 int NumElements=RightEnd-L-1;//元素總數 int Tmp=0;//臨時陣列指標 int TmpA[10];//臨時陣列 //合併 while(L<=LeftEnd&&R<=RightEnd){ if (c[L]<=c[R]) TmpA[Tmp++]=c[L++]; else TmpA[Tmp++]=c[R++]; } while (L<=LeftEnd){ TmpA[Tmp++]=c[L++]; } while (R<=LeftEnd){ TmpA[Tmp++]=c[R++]; } //TmpA-->c for(int i=0;i<NumElements;i++,RightEnd--){ c[RightEnd]=TmpA[RightEnd]; } //顯示結果 printf("歸併排序結果:"); for(int i=0;i<10;i++){ printf("%d\t",c[i]); } printf("中位數:%f", (c[4]+c[5])/2.0); return 0; }

結果

這裡寫圖片描述