两数组有序,将两数组合并且合并后有序,求出合并后的第k小元素

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

 

posted @ 2017-10-13 20:59  清风☆薰衣草  阅读(134)  评论(0)    收藏  举报