二分查找

二分查找原理:

  又称为折半查找,元素必须是顺序存储的,按照大小有序排列.

  如果元素按照升序排列,取中间位置的元素与要查找的元素比较,两者相等就表示查找元素成功;否则,按照中间位置的元素为界限,将左右的元素分成两部分,如果中间位置的元素大于要查找的元素,就在左边部分取中间位置继续查找;如果中间位置的元素小于要查找的元素,就在右边部分取中间位置继续查找;重复以上操作,直到查找到要查找的元素或者不再能分成左右两部分为止(查找不成功).

示例:

  例如对于数组[11,22,33,44,55,66,77,88,99]来说,数组长度为9,数组下标为0,1,2,3,4,5,6,7,8

  示例一:查找77

    第一次查找:

      起始数组下标为0,终止数组下标为8,中间位置数组下标为4,元素为55;

      由于55<77,则在55的右侧继续查找;

    第二次查找:

      起始数组下标为5,终止数组下标为8,中间位置数组下标为6,元素为77;

      由于77==77,查找成功;

  示例二:查找17

    第一次查找:

      起始数组下标为0,终止数组下标为8,中间位置数组下标为4,元素为55;

      由于55>17,则在55的左侧继续查找;

    第二次查找:

      起始数组下标为0,终止数组下标为3,中间位置数组下标为1,元素为22;

      由于22>17,则在22的左侧继续查找;

    第三次查找:

      起始数组下标为0,终止数组下标为0,中间位置数组下标为0,元素为11;

      由于11<17,则在11的右侧继续查找;

    第四次查找:

      起始数组下标为1,终止数组下标为0,可知这种情况是不合常理的,可以判断为查找不到;

总结:

  二分查找的退出循环条件可以总结为:查找的元素与被查找的元素相等和起始下标大于终止下标;

  二分查找的循环条件可以使用起始下标小于终止下标;

Java代码实现:

package com.yg.study;

public class BinarySearch {
    public static void main(String[] args) {
        int[] arr= {11,22,33,44,55,66,77,88,99};
        boolean flag=doSearch(arr,77);
        //boolean flag=doSearch(arr,17);
        System.out.println(flag?"查找成功":"查找失败");        //查找结果打印
    }

    private static boolean doSearch(int[] arr,int num) {
        int beginIndex=0;        //起始索引取数组的最小索引
        int endIndex=arr.length-1;        //终止索引取数组的最大索引
        int middleIndex=0;        //中间位置索引设置初始值
        while(beginIndex<=endIndex) {        //如果起始索引大于终止索引,退出循环
            middleIndex=(beginIndex+endIndex)>>>1;        //计算中间位置索引
            if (arr[middleIndex]==num) {        //查找到指定的元素
                return true;
            }else if (arr[middleIndex]>num) {
                endIndex=middleIndex-1;
            }else {
                beginIndex=middleIndex+1;
            }
        }
        return false;        //没有查找到指定的元素
    }
}

 

结果展示:

   

posted @ 2019-01-24 18:04  安徒生敲代码  阅读(144)  评论(0编辑  收藏  举报