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 }