二分查找——图文详解(加代码)

二分查找

1.什么是二分查找

        二分查找也叫折半查找,是在一组有序(升序/降序)的数据中查找一个元素,它是一种效率较高的查找方法。

 2.原理

        1.二分查找的数组必须是有序数组。

        2.数组里的元素一般为可以比较大小的数值型。

        3.将想要查找的目标元素与查找范围内的中间元素进行比较,如果相等,查找结束,反之,把目标元素分到较大或者是较小的范围在进行比较。

        4.通过分组可将查找范围缩小一半。

        5.重复步骤三,直到目标元素与查找范围内中间元素相等或者没有这个目标元素,查找结束。        

        6.二分查找的时间复杂度O(log2n)

3.例子

        现有一个有序数组arr[]{1,2,3,4,5,6,7,8}

        数组有偶数个元素时,当取中间元素,遇到两边数据个数不同时,并不影响我们查找元素,只需要规定是向上或向下取整。

        我们规定value是想要查找的目标元素,mid是中间元素的指针,beign是查找范围内第一个元素的指针,end是查找范围内最后一个元素的指针。

        第一步,确立mid的指向。

二分查找——图文详解(加代码)_第1张图片

        第二步,使mid指向的元素与value的值进行比较。

二分查找——图文详解(加代码)_第2张图片

        第三步,找到目标元素。

二分查找——图文详解(加代码)_第3张图片

java代码实现

 public static void main(String[] args) {

        //定义一个有序的数组
        int[] arr = new int[100];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = i;
        }
        binarySearch(arr, 40);
    }

    /***
     *
     * @param arr
     * @param value
     * @return   查询的次数
     */
    public  static int binarySearch(int[] arr,int value) {
        System.out.println("****************使用二分法查找****************");
        int mid = 0; // 检索的时候
        int start = 0;  //用start和end两个索引控制它的查询范围
        int end = arr.length;
        int count = 0;
        for (int i = 0; i < arr.length; i++){
            count++;
            mid = (start + end) / 2;
            if(arr.length - 1 == i){
                System.out.println("抱歉,没有找到");
            }else if (arr[mid] < value){
                start = mid;
            }else if (arr[mid] > value){
                end = mid;
            }else{
                System.out.println(arr[mid] + "找到了,在数组下标为" + mid + "的地方,查找了" + count + "次。");
                break;
            }
        }
        return count;
    }

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