デモを見つけるためのJavaの二分法(オーバーフロー防止バグ)

public class BinarySearchTest {

    public static void main(String[] args) {
        int[] a = {2, 3, 5, 7, 89};
        System.out.println(binarySearch(a, 5));
        System.out.println(binarySearch(a, 0));
        System.out.println(binarySearch(a, 6));
        System.out.println(binarySearch(a, 99));
        System.out.println(binarySearch(a, 1));
    }

    /**
     * 算法的思想就是:从数组中间开始,每次排除一半的数据,时间复杂度为O(lgN)。
     * 这依赖于数组有序这个性质。如果val存在数组中,则返回t在数组的位置;否则,不存在则返回-(start+1)。
     *
     * @param array 数组
     * @param val   查找的值
     * @return
     */
    public static int binarySearch(int[] array, int val) {
        int start = 0;
        int end = array.length - 1;
        while (start <= end) {
            int m = start + (end - start) / 2;//防止溢出,如果start和end都大于int最大值的一半,会发生溢出
            if (array[m] > val) {
                end = m - 1;
            } else if (array[m] < val) {
                start = m + 1;
            } else {
                return m;
            }
        }
        //为什么val不存在数组中时不是返回-1而要返回-(start+1)。
        //1如果查找不成功,则start的值恰好是val应该在数组中插入的位置。
        //2之所以返回-(start+1)而不是直接返回 -start 是因为start可能为0,
        //如果直接返回-start就无法判断是正常返回位置0还是查找不成功返回的0。
        return -(start + 1);
    }

}

 

おすすめ

転載: blog.csdn.net/cs373616511/article/details/108168017