c语言求第k小的元素心得体会,面试题之陈利人 两个数组中求第k小元素

#include

using namespace std;

// define size for array

const int size = 20;

// function declare to the problem

int Super_bisearch(int * A,const int Asize,int * B,const int Bsize,const int k);

// function declare to binary search

int Bisearch(int *d,int length,int key );

// function main

int main()

{

int * A = new int[size];

int * B = new int[size];

for(int i = 0;i

{

A[i] = 2*i;

cout<

B[i] = 2*i+5;

cout<

}

cout<

int i = 1;

while( i <= size*2 )

{

cout<

i++;

}

system("pause");

return 0;

}

// function define to the problem

int Super_bisearch(int * A,const int Asize,int * B,const int Bsize,const int k)

{

if(A == NULL || B == NULL || Asize < 0 || Bsize <0 || k <= 0 || k > (Asize+Bsize))

{

cout<

return 1;

}

else if(Asize != Bsize)

{

cout<

return 1;

}

int sa,sb,ba,bb;

sa = 0;

sb = 0;

ba = (Asize < k)? Asize:k;

bb = (Bsize < k)? Bsize:k;

ba--;bb--;

int ca ;

int cb ;

int number = k;

ca = (sa+ba)/2;

cb = Bisearch(B,Bsize,A[ca]);

while( number > 2 &&(sa

{

ca = (sa+ba)/2;

cb = Bisearch(B,Bsize,A[ca]);

if( number > ( ca + cb - sa - sb) )

{

number = number - ( ca + cb - sa - sb );

sa = ca;

sb = cb;

if( ( ca + cb - sa - sb ) == 0) break;

}

else if( ( ca + cb - sa - sb) == number )

{

return A[ca]>B[cb]?A[ca]:B[cb];

}

else if( number < ( ca + cb - sa - sb) )

{

ba = ca;

bb = cb;

}

}

int * d = new int[ba-sa+1+bb-sb+1];

int i = sa,j = sb,bit = 0;

while(i <= ba && j <= bb)

{

if(A[i]

d[bit++] = A[i++];

else d[bit++] = B[j++];

}

while(i<=ba)

d[bit++] = A[i++];

while(j<=bb)

d[bit++] = B[j++];

return d[number-1];

}

// function define to binary search

int Bisearch(int *d,int length,int key )

{

if( d == NULL && length <= 0 )

{

cout<

return -1;

}

else{

int s = 0 ;

int e = length-1 ;

int c ;

while(s < e)

{

c = ( s + e ) / 2;

if( d[c] == key )

{

return c;

}

else if( key < d[c] )

{

e = c-1;

}

else if( key > d[c] )

{

s = c;

if( e-s == 1 && d[s]

{

return s;

}

}

}

return s;

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值