二分查找

二分查找的时间复杂度logn,前题是有序

先与l+(r-l)/2处比较就是中间位置比较,为什么不是(l+r)/2呢,因为l+r相加有可能会发生溢出。

小于中间位置,则在左边位置继续重复上一步,大于则在右边重复,如此重复即可。

public static int find(Comparable[] arr, Comparable target) {

// 在arr[l...r]之中查找target

    int l =0, r = arr.length-1;

    while( l <= r ){

//int mid = (l + r)/2;

        // 防止极端情况下的整形溢出,使用下面的逻辑求出mid

        int mid = l + (r-l)/2;

        if( arr[mid].compareTo(target) ==0 )

return mid;

        if( arr[mid].compareTo(target) >0 )

r = mid -1;

else

            l = mid +1;

    }

return -1;

}


递归实现

private static int find(Comparable[] arr, int l, int r, Comparable target){

if( l > r )

return -1;

    //int mid = (l+r)/2;

    // 防止极端情况下的整形溢出,使用下面的逻辑求出mid

    int mid = l + (r-l)/2;

    if( arr[mid].compareTo(target) ==0 )

return mid;

    else if( arr[mid].compareTo(target) >0 )

return find(arr, l, mid-1, target);

else

        return find(arr, mid+1, r, target);

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 6,146评论 0 2
  • php -@amazeUI -2016-11-28 11:45:31 二分查找和快速排序思想上有很大的相似度,就...
    与子笑阅读 2,833评论 0 0
  • 感恩一位同乡好友,我们一行几人去到另一同乡开的农家乐,一起品家乡菜,议家乡情!感恩同乡带我们一起看电影,放松身心!...
    碧霞阅读 803评论 0 0
  • 昨天,米多去叔叔家看一个多月大的小妹妹,叔叔送他一个电动玩具狗,米多特别喜欢,在叔叔家玩了好一会。 离开的时候米多...
    米多多成长日记阅读 1,501评论 0 0
  • 一弯新月 几颗明星 照出夜空的遥远和深邃 一丝清风 几处蛙声 叫出几分宁静和空幽 一个人 几个树影 夜空下 小渠旁...
    白马骑士99阅读 1,404评论 0 3