1.2 二分查找

21 阅读1分钟

Basic

需求:在有序数组A内,查找target

  • 如果找到返回索引

  • 如果找不到返回-1

算法描述
前提给定一个内含n个元素的有序数组A,满足A0<=A1<=A2<=...<=An-1,一个待查值target
1设置i=0,j=n-1
2如果i>j,结束查找,没找到
3设置m = floor((i+j)/2),m为中间索引,floor是向下取整(<=(i+j)/2的最小整数)
4如果target < Am设置j=m-1,跳到第2步
5如果Am < target设置i=m+1,跳到第2步
6如果Am = target,结束查找,找到了

代码实现

package com.liulw.algorithms.binarysearch;

public class BinarySearch {
    /**
     * 二分查找基础版
     * <p>
     * Params:a->待查找的升序数组
     * target->待查找的目标值
     * <p>
     * Returns:
     * 找到则返回索引
     * 找不到返回-1
     */
    public static int binarySearchBasic(int[] a, int target) {
        int i = 0, j = a.length - 1; //设置指针和初值
        while (i <= j) { //范围内有东西
            int m = (i + j) / 2;
            if (target < a[m]) { //目标在左边
                j = m - 1;
            } else if (a[m] < target) { //目标在右边
                i = m + 1;
            } else { //找到了
                return m;
            }
        }
        return -1;
    }
}

运行结果

package com.liulw.algorithms.binarysearch;

public class TestBinarySearchBasic {
    public static void main(String[] args) {
        int[] a = {7, 11, 13, 15, 24, 26, 27, 45};
        int r1 = BinarySearch.binarySearchBasic(a,7);
        int r2 = BinarySearch.binarySearchBasic(a,13);
        int r3 = BinarySearch.binarySearchBasic(a,24);
        int r4 = BinarySearch.binarySearchBasic(a,30);

        System.out.println("r1:"+r1+"\nr2:"+r2+"\nr3:"+r3+"\nr4:"+r4);
    }
}
r1:0
r2:2
r3:4
r4:-1