資料結構-二路歸併-練習題1
阿新 • • 發佈:2018-11-27
題目
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;
}