找出这两个有序数组的第k个数(C语言)

#include <stdio.h>
#include <limits.h>

int findK(int a[],int len_a,int begin_a,int b[],int len_b,int begin_b,int k){
	//a/b数组无元素可查 直接返回b/a数组中的第begin_b/begin_a+k个元素值 
	if(begin_a>=len_a) return b[begin_b+k-1];
	if(begin_b>=len_b) return a[begin_a+k-1];
	//k值为1时 返回a和b数组begin位置值最小的那个数
	if(k==1) return a[begin_a]>b[begin_b]?b[begin_b]:a[begin_a]; 
	 
	//取两数组begin开始的k/2位置的数的值,前提是被查询的数组剩下的元素的个数大于等于k/2 
	//ps:两数组至少有一个满足条件 否则一开始k>len_a+len_b 
	int mid_a=INT_MAX;
	int mid_b=INT_MAX;
	if(begin_a+k/2-1<len_a)mid_a=a[begin_a+k/2-1];
	if(begin_b+k/2-1<len_b)mid_b=b[begin_b+k/2-1];
	
	//比较数组a和b第k/2个数的大小 然后删去较小的那个数的数组的begin开始的k/2个数
	if(mid_a>mid_b) return findK(a,len_a,begin_a,b,len_b,begin_b+k/2,k-k/2);
	return findK(a,len_a,begin_a+k/2,b,len_b,begin_b,k-k/2);
}

int main (){
	int a[]={2,8,6};
	int b[]={1,3};
	int len_a=sizeof(a)/sizeof(a[0]);
	int len_b=sizeof(b)/sizeof(b[0]);
    int mid1=findK(a,len_a,0,b,len_b,0,(len_a+len_b+1)/2);
    int mid2=findK(a,len_a,0,b,len_b,0,(len_a+len_b+2)/2);
	printf("%.2f",(mid1+mid2)/2.0);
	return 0;
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值