二分查找

作者: 一个人的飘 | 来源:发表于2018-09-25 20:59 被阅读0次
二分查找的时间复杂度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);

}

相关文章

网友评论

    本文标题:二分查找

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