史上最完整的二分查找

public static <T extends Comparable<T>> int serach(T[] src, T key){
    int start = 0;
    int end = src.length -1;
    while(start <= end){
        //int middle = (start + end) / 2; //隐含bug,两个非常大的数相加会导致数据溢出
        //int middle = (end - start) / 2 + start;
        int middle = (end + start) >>> 1; //逻辑右移不会溢出
        T middleValue = src[middle];
        if(middleValue.equals(key)) 
            return middle;
        else if(middleValue.compareTo(key) > 0)
            end = middle - 1;
        else 
            start = middle + 1;
    }
    return -1;  
}

public static <T> int serach(T[] src, T key, Comparator<T> comp){
    int start = 0;
    int end = src.length -1;
    while(start <= end){
        //int middle = (start + end) / 2; //隐含bug,两个非常大的数相加会导致数据溢出
        //int middle = (end - start) / 2 + start;
        int middle = (end + start) >>> 1; //逻辑右移不会溢出
        T middleValue = src[middle];
        if(middleValue.equals(key)) 
            return middle;
        else if(comp.compare(middleValue, key) > 0)
            end = middle - 1;
        else 
            start = middle + 1;
    }
    return -1;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容