题目
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;
}