Description
一个长度为L (L ≥ 1)的升序序列S,处在第[L/2]个位置的数称为S的中位数。例如,若序列S1=(11, 13, 15, 17, 19),则S1的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2= (2, 4, 6, 8, 20),则S1和S2的中位数是11。
给出两个有序序列A和B,它们的长度相等。设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。
Input
单测试用例。
第一行是L,表示两个有序序列A和B的长度。1 < L ≤ 1000000
第二行是序列A,空格分隔的L个整数。
第三行是序列B,空格分隔的L个整数。
Output
输出一个整数,A和B的中位数。无需换行。
Sample Input
5
11 13 15 17 19
2 4 6 8 20
Sample Output
11
代码入下:
#include<stdio.h>
int a[2000000],n;
void quick_sort(int l,int r);
int main(){
scanf("%d",&n);
for(int i=0;i<2*n;i++){
scanf("%d",&a[i]);
}
quick_sort(0,2*n-1);
printf(" %d",a[(2*n)/2-1]);
return 0;
}
void quick_sort(int l,int r){
if(l<r){
int i=l,j=r,X=a[l];
while(i<j){ //跑一趟
while(i<j && a[j]>=X){ //右往左
j--;
}
if(i<j){
a[i++]=a[j];
}
while(i<j && a[i]<X){ //左往右
i++;
}
if(i<j){
a[j--]=a[i];
}
}
a[i]=X;//中
quick_sort(l,i-1); //左
quick_sort(i+1,r); //右
}
}