二分查找 / 折半查找 (最简单明了的讲解,不懂找我)

算法思路:

1:一定是要在排好序的列表数组中。(乱序的话先用排序算法排好序)。

2:直接拿数组中间的值比较。(奇数情况下Java是向下取整)。

3:目标值等于中间值,直接返回。

4:目标值大于中间值,忽略左边的一半,继续拿剩余右边的一半的中间值比较。

5:目标值小于中间值,则忽略右边的一半,拿左边的中间值继续比较。

6:如果左边起点大于等于右边起点,证明没有可比较的了,但是还没找到,证明不存在。

先来看看代码详细解释!

二分查找 / 折半查找 (最简单明了的讲解,不懂找我)_第1张图片
二分查找 / 折半查找 (最简单明了的讲解,不懂找我)_第2张图片

如果觉得文字解释很抽象很枯燥,没关系,debug一步一步来!

设置目标值为8;开始找。

1:

二分查找 / 折半查找 (最简单明了的讲解,不懂找我)_第3张图片

经过这一轮,要比较的数组缩小为{4,5,6,7,8,9};忽略第一轮中间值“4”的左半边。

2:

二分查找 / 折半查找 (最简单明了的讲解,不懂找我)_第4张图片

经过这一轮折半,剩余{6,7,8,9}.

3:

二分查找 / 折半查找 (最简单明了的讲解,不懂找我)_第5张图片

经过这一轮折半,剩下{7,8,9}

4:

二分查找 / 折半查找 (最简单明了的讲解,不懂找我)_第6张图片

所以经过这四次比较后,我们就能找到了要找的值,如果不用折半查找,而从 1,2,3,4,5…这样,最少要到第八次才能找到,假如数据量大,上百万的时候很明显一个个比较是不现实的,用了折半查找一次能减少一半,效率是非常非常高的

好了,到这些把源码给大家贴出来,有兴趣尝试的可以自己复制去编辑器里run一run,其实非常简单好理解。
 public static void main(String[] args) {

    // 二分法查找
    int sortList[] = {0,1,2,3,4,5,6,7,8,9};
    int target = 8;
    int leftSide = 0;
    int rightSide = sortList.length-1;
    int middle ;

    while(true){
        middle = (leftSide+rightSide)/2;
        int temp = sortList[middle];

        if(temp == target){
            System.out.println("target目标位:"+target);
            break;
        } else {

            if(temp>target){
                // 假如中间数大于目标,证明要往左边找
                rightSide = middle;
            }else if(temp=rightSide){
                // 比较到这一步都没有,证明没有这个值
                System.out.println("不存在这个target值!");
                break;
            }

        }
    }

}

好了暂时先写到这里咯!谢谢大家!鞠躬!私信和留言都必回哈!

你可能感兴趣的:(算法与数据结构)