返回两个有序数组合并后的第K个的数

//返回两个有序数组合并后的第K个的数
思路:根据二分法,判断当前二数组下,k/2个位置哪个小,
小的,肯定占据了k/2个位置了,在从过滤小的k/2数据,
看剩下的数组,现在找第k-k/2个元素了(k/2个元素已将找到了) int GetK(int* arry1,int* arry2,int len1,int len2,int k) { if((arry1==NULL&&arry2==NULL)||(len1+len2<k)||k<1) { throw new exception("invalid params"); } if(arry2==NULL) { if(k<len1) return arry1[k]; else throw new exception("over index1"); } if(arry2==NULL) { if(k<len2) return arry2[k]; else throw new exception("over index2"); } int mid=k/2; int one=0;//第一个数组的当前移动了的下标 int two=0;//第二个数组的当前移动了的下标 while(mid) { if(mid+one<=len1&&mid+two<=len2)//都不越界 { if(arry1[mid+one]>arry2[mid+two]) { two += mid; } else { one += mid; } k=k-mid; mid =k/2; } else { if(mid+one>len1)//数组1越界了 { while(mid) { if(one+1<=len1) { if(arry1[one+1]>arry2[two+mid]) { two+=mid; k=k-mid; mid =k/2; } else { one+=1; } } else { return arry2[k]; } } } else if(mid+two>len2)//数组二越界了 { while(mid) { if(two+1<=len2) { if(arry1[two+1]>arry2[one+mid]) { one+=mid; k=k-mid; mid =k/2; } else { two+=1; } } else { return arry2[k]; } } } } } return (arry1[one+k]<arry2[two+k]?arry1[one+k]:arry2[two+k]); } int main(int argc,char argv) { int data[]={0,1,3,5,7,9,11,13}; int arry[]={0,2,4,6,8,10,12,14}; cout<<"result : "<<GetK(data,arry,7,7,0)<<endl; }

  

posted @ 2014-09-22 09:22  xswby  阅读(164)  评论(0)    收藏  举报