折半查找——Java实现

一、查找思想

       折半查找 也称为二分查找,是一种效率较高的查找方法,查找时要求表中的节点按关键字的大小排序,并且要求线性表顺序存储。

  1. 首先用要查找的关键字值(key)与中间位置结点的关键字值(arr[mid])相比较;
  2. 若比较结果相等,则查找完成;若不相等,再根据要查找的关键字值(key)与该中结点关键值(mid)的大小来确定下一步在那个子表中进行;
  3. 若待查关键值大于中间结点的关键字值(key > arr[mid])),则应查找中间结点以后的字表,否则(key < arr[mid])),查找中间结点以前的字表;
  4. 重复步骤1~3,直到找到满足条件的结点,或者明确表中没有这样的结点。

二、图解

        假设用变量 lowhigh 分别存储待查元素所在范围的下界和上界,变量 mid 存储区间的中间位置,即 mid = [(low + high) / 2]

二分查找-案例

三、代码实现

public class BinarySearch {
    public static void main(String[] args) {
        int[] arr = {6, 12, 33, 87, 90, 97, 108, 561};

        System.out.println(binarySearch(arr, 90));
        //递归查找
        System.out.println(binarySearch(arr, 0, arr.length - 1, 90));
    }

    /**
     * @param arr 待排序列
     * @param key 待查找值
     * @return 待查找值在待排序列中的位置
     */
    private static String binarySearch(int[] arr, int key) {
        int low = 0;
        int high = arr.length - 1;

        while (low <= high) { //必须为 '<=' 否则无法匹配到指定的key;
            int mid = (low + high) / 2;

            if (arr[mid] == key) {
                return "Successful matching [" + (mid + 1) + "]";
            } else if (arr[mid] > key) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        return "Successful matching -1";
    }

    /**
     * 递归实现二分查找
     * @param arr 待排序列
     * @param start 待排序列开始值
     * @param end 待排序列结束值
     * @param key 待查找值
     * @return 待查找值在待排序列中的位置
     */
    private static int binarySearch(int[] arr, int start, int end, int key) {

        if (key < arr[start] || key > arr[end] || start > end) { //start > end 不能为'>='
            return -1;
        }

        int mid = (start + end) / 2;
        if (key > arr[mid]) {
            return binarySearch(arr, mid + 1, end, key);
        } else if (key < arr[mid]) {
            return binarySearch(arr, start, mid - 1, key);
        } else {
            return mid + 1;
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/luomeng/p/10585291.html