美文网首页
1.2.9 BinarySearch

1.2.9 BinarySearch

作者: 风亡小窝 | 来源:发表于2016-06-16 14:07 被阅读12次
    package search;
    
    public class BinarySearch{
    
        public static int rank(int key, int[] a) {
            return rank(key, a, 0, a.length - 1);
        }
        
        /**
         * 根据首尾元素的比较结果判断数组的升降序
         * @param key
         * @param a
         * @param lo
         * @param hi
         * @return
         */
        public static int rank(int key, int[] a, int lo, int hi) {
            return a[lo] < a[hi] ? rankAsc(key, a, lo, hi) : rankDesc(key, a, lo, hi);
        }
        
        /**
         * 对升序数组进行查找
         * @param key
         * @param a
         * @param lo
         * @param hi
         * @return
         */
        public static int rankAsc(int key, int[] a, int lo, int hi) {
            while(lo <= hi){
                int mid = (lo + hi) / 2;
                if(key < a[mid]) hi = mid - 1;
                else if(key > a[mid]) lo = mid + 1;
                else return mid;
            }       
            return -1;
        }
        
        /**
         * 对降序数组进行查找
         * @param key
         * @param a
         * @param lo
         * @param hi
         * @return
         */
        public static int rankDesc(int key, int[] a, int lo, int hi) {
            while(lo <= hi){
                int mid = (lo + hi) / 2;
                if(key > a[mid]) hi = mid - 1;
                else if(key < a[mid]) lo = mid + 1;
                else return mid;
            }       
            return -1;
        }
    
        /**
         * 返回匹配键的最小索引
         * @param key
         * @param a
         * @return
         */
        public static int rankFirstIndex(int key, int[] a) {
            int lo = 0;
            int hi = a.length - 1;
            int index = -1;
            
            while(lo <= hi){
                int mid = (lo + hi) / 2;
                if(key < a[mid]) hi = mid - 1;
                else if(key > a[mid]) lo = mid + 1;
                else{index = mid; break;}
            }
            
            while(index > 0){
                if(a[index-1] != a[index]) break;
                else index--;
            }
            
            return index;
        }
    }
    
    

    相关文章

      网友评论

          本文标题:1.2.9 BinarySearch

          本文链接:https://www.haomeiwen.com/subject/cmpmdttx.html