美文网首页
折半查找(带泛型参数)

折半查找(带泛型参数)

作者: _Raye | 来源:发表于2017-04-04 11:01 被阅读0次

    优化:

    package org.mobiletrain;
    
    import java.util.Comparator;
    
    //Collections工具类
    public class Test01 {
        
        //折半查找
        public static <T extends Comparable<T>> int binarySearch(T[] array,T key){
            int start = 0;
            int end = array.length - 1;
            while(start <= end){
                int mid = (end - start) / 2 + start;
                if (array[mid].equals(key)) {
                    return mid;
                }
                else if (array[mid].compareTo(key) > 0) {
                    end = mid - 1;
                }
                else {
                    start = mid + 1;
                }
            }
            return -1;
        }
        
        public static <T> int binarySearch(T[] array,T key,Comparator<T> comp){
            int start = 0;
            int end = array.length - 1;
            while(start <= end){
                 //int mid = (start + end) / 2; //有溢出的风险
                int mid = (end - start) / 2 + start;
                // int mid = (start + end) >>> 1; //逻辑右移(不带符号位的右移)
                if (array[mid].equals(key)) {
                    return mid;
                }
                else if (comp.compare(array[mid],key) > 0) {
                    end = mid - 1;
                }
                else {
                    start = mid + 1;
                }
            }
            return -1;
        }
    
    }
    

    更优化:

    class Hello {
    
      public static <T extends Comparable<T>> int binarySearch(T[] array, T key) {
        return _binarySearch(array, key, 0, array.length - 1);
      }
      
      private static <T extends Comparable<T>> int _binarySearch(T[] array, T key, int start, int end) {
        if (start <= end) {
          int mid = (start + end) >>> 1;
          if (key.compareTo(array[mid]) < 0) {
            return _binarySearch(array, key, start, mid - 1);
          } else if (key.compareTo(array[mid]) > 0) {
            return _binarySearch(array, key, mid + 1, end);
          } else {
            return mid;
          }
        }
        return -1;
      }
    
      public static void main(String[] args) {
        String[] x = { "apple", "banana", "grape", "pitaya", "watermelon" };
        System.out.println(binarySearch(x, "grape"));
        System.out.println(binarySearch(x, "orange"));
        System.out.println(binarySearch(x, "apple"));
      }
    }
    

    相关文章

      网友评论

          本文标题:折半查找(带泛型参数)

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