二分查找【Java算法】

文章目录

    • 1. 概念
    • 2. 思路
    • 3. 代码实现

1. 概念

二分查找又叫折半查找,要求待查找的序列有序,每次取中间位置的值与待查关键字比较,如果待查关键字比中间位置的值小,则在前半部分循环这个查找的过程,反之,在后半部分循环这个查找的过程。直到查到了为止,否则序列中没有待查的关键字。

2. 思路

① while 循环折半,什么时候停止?在不断折半的过程中,我们的目标区间是不断缩小的,当左边界开始大于右边界的时候就是循环应该停止的时候,在以下代码中,我用 left 表示左边界(初始值为0),right 表示右边界(初始值为数组长度减1);

② 折半之后有个中间值,我们试图拿它来跟待查找关键字进行比对,因为待查找序列是从大到小排列的,当然是小的在左边大的在右边,通过比较中间值和待查找关键字的大小,我们就进一步缩小了查找的范围。下面我用 mid 作为中间值变量,它的位置为左边界与右边界之和除2;

③ 向右查找,即待查关键字大于中间值。这时候我们的右边界是不需要动的,左边界应是中间中间位置的下一位,即 mid + 1;

④ 向左查找,即待查关键字小于中间值。这时候左边界是不需要动的,右边界应是中间位置的上一位,即 mid - 1;

⑤ 什么情况下查找成功呢?当中间值恰好等于待查关键字的时候,查找成功。 返回 mid + 1;

⑥ 就那么确定你能查到?万一人家这个序列里根本就没有你要的这个数据呢?所以这里我们还要给出一个回应,能查到好说直接就结束程序,如果找到最后了也没找到,自然是要退出 while 循环的,然后给它返回一个 -1,代表我们并没有找到这个值。

3. 代码实现

public class Main {
    public static void main(String[] args) {
        int[] arr = {2, 4, 5, 6, 7, 8, 10, 11};
        int result = select(arr, 10);
        System.out.println(result);
    }

    public static int select(int[] array, int a) {
        int left = 0;
        int right = array.length - 1;
        int mid;
        while (left <= right) {
            mid = (left + right) / 2; //中间位置
            if (array[mid] == a) {
                return mid + 1;
            } else if (array[mid] > a) {  //向左查找
                right = mid - 1;
            } else {  //向右查找
                left = mid + 1;
            }
        }
        return -1;
    }
}

二分查找【Java算法】_第1张图片

你可能感兴趣的:(算法合集,java,算法,开发语言)