1 package org.xiu68.ch02;
2
3 public class Ex2_22 {
4
5 public static void main(String[] args) {
6 // TODO Auto-generated method stub
7 //两数组有序,寻找两数组合并后第k小元素,O(logm+logn)
8 int[] a=new int[]{1,3,5,7,9,11,13,15,17,19};
9 int[] b=new int[]{0,2,4,6,8,10,12,14,16,18};
10
11 for(int k=1;k<11;k++){
12 int result=find(a, b, 0, a.length-1, 0, b.length-1, k);
13 System.out.println(result);
14 }
15 }
16
17 public static int find(int a[],int b[],int aStart,int aEnd,int bStart,int bEnd,int k){
18 int aMid = (aStart + aEnd) / 2; //a数组中间元素位置
19 int bMid = (bStart + bEnd) / 2; //b数组中间元素位置
20 if (aStart > aEnd) //a数组要计算元素个数为0
21 return b[bStart+k-1];
22 if (bStart > bEnd) //b数组要计算元素个数为0
23 return a[aStart+k-1];
24
25 if (a[aMid] <= b[bMid]) { //b[中间位置]大于a[中间位置]的情况
26 if (k <= (aMid-aStart) + (bMid-bStart) + 1) //k小于两数组合并后的中间位置
27 return find(a,b,aStart, aEnd, bStart, bMid-1, k);
28 else //k大于两数组合并后的中间位置
29 return find(a,b,aMid+1, aEnd, bStart, bEnd, k-(aMid-aStart)-1);
30 } else { //a[中间位置]大于b[中间位置]的情况
31 if (k <= (aMid-aStart) + (bMid-bStart) + 1)
32 return find(a,b,aStart, aMid-1, bStart, bEnd, k);
33 else
34 return find(a,b,aStart, aEnd, bMid+1, bEnd, k-(bMid-bStart)-1);
35 }
36 }
37 }