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

折半查找(带泛型参数)

作者: _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"));
  }
}

相关文章

  • 折半查找(带泛型参数)

    优化: 更优化:

  • Dart匿名函数+泛型

    匿名函数使用 无参数的匿名函数 带参数的匿名函数 函数体只有一行时,简写 泛型的基本使用 泛型集合 泛型类 泛型方法

  • PHP查找算法

    静态查找 顺序查找 折半查找 递归折半查找

  • 泛型学习

    1.泛型是Java中参数化类型的方式。将类型也作为一种参数进行传递。2.它有泛型的方法,泛型参数,泛型类。3.泛型...

  • Java泛型

    泛型的概念 泛型就是参数化类型。定义一个带参数的方法时有形参,调用这个方法的时候要传入实参。而所谓参数化类型就是这...

  • go 泛型

    go 泛型 1. 类型参数(Type parameters) Go语言的泛型(Generic)叫做类型参数。泛型可...

  • Java获取泛型参数的Class类型

    需求:两个类:A带泛型参数T,B继承A并给出泛型参数类型,现在想在A中获取T的Class类型。 执行一下代码:

  • java的泛型

    泛型,就是参数化类型的意思,具体表现为泛型类,泛型接口,泛型方法。 泛型主要用于编译过程不确定参数可能的类型,需要...

  • java泛型中类型擦除的一些思考

    java泛型 java泛型介绍 java泛型的参数只可以代表类,不能代表个别对象。由于java泛型的类型参数之实际...

  • [Swift5.1] 16-泛型

    泛型(Generics) 泛型函数 泛型可以将类型参数化,提高代码复用率,减少代码量 T代表 不确定类型参数 泛型...

网友评论

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

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