二分查找

Posted 慧Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找相关的知识,希望对你有一定的参考价值。

二分查找(变形)

1. 二分查找应用的几个场景

package search;

/**
 * 二分查找 变形题
 */

public class BinarySearchApp {

    /**
     * 变形一:查找第一个值等于给定值的元素
     *
     * @param a
     *            可能存在重复的数据
     * @param n
     */

    public static int binarySearchForFirstEqual(int[] a, int n, int value) {
        int low = 0;
        int high = n - 1;
        while (low <= high) {

            // 1.不用(low+high)/2是因为low+high可能会很大产生溢出
            // 2.相比除2,用右移一位效率更高
            int mid = low + ((high - low) >> 1);
            if (a[mid] > value) {
                high = mid - 1;
            } else if (a[mid] < value) {
                low = mid + 1;
            } else {
                if ((mid == 0 || a[mid - 1] != value)) {
                    return mid;
                } else {
                    high = mid - 1;
                }
            }
        }

        return -1;
    }

    /**
     * 变形二:查找最后一个值等于给定值的元素
     *
     * @param a
     *            可能存在重复的数据
     * @param n
     */

    public static int binarySearchForLastEqual(int[] a, int n, int value) {
        int low = 0;
        int high = n - 1;
        while (low <= high) {
            int mid = low + ((high - low) >> 1);
            if (value > a[mid]) {
                low = mid + 1;
            } else if (value < a[mid]) {
                high = mid - 1;
            } else {
                if (mid == n - 1 || a[mid + 1] != value) {
                    return mid;
                } else {
                    low = mid + 1;
                }
            }

        }

        return -1;
    }

    /**
     * 变形三:查找第一个值大于等于给定值的元素
     *
     * @param a
     *            可能存在重复的数据
     * @param n
     */

    public static int binarySearchForFirstEqualOrGreater(int[] a, int n, int value) {
        int low = 0;
        int high = n - 1;
        while (low <= high) {

            // 1.不用(low+high)/2是因为low+high可能会很大产生溢出
            // 2.相比除2,用右移一位效率更高
            int mid = low + ((high - low) >> 1);
            if (a[mid] >= value) {
                if (mid == 0 || a[mid - 1] < value) {
                    return mid;
                } else {
                    high = mid - 1;
                }
            } else {
                low = mid + 1;
            }
        }

        return -1;
    }

    /**
     * 变形四:查找最后一个值小于等于给定值的元素
     *
     * @param a
     *            可能存在重复的数据
     * @param n
     */

    public static int binarySearchForFirstEqualOrSmaller(int[] a, int n, int value) {
        int low = 0;
        int high = n - 1;
        while (low <= high) {

            // 1.不用(low+high)/2是因为low+high可能会很大产生溢出
            // 2.相比除2,用右移一位效率更高
            int mid = low + ((high - low) >> 1);
            if (a[mid] <= value) {
                if (mid == 0 || a[mid + 1] > value) {
                    return mid;
                } else {
                    low = mid + 1;
                }
            } else {
                high = mid - 1;
            }
        }

        return -1;
    }

    public static void printAll(int[] a) {
        for (int v : a) {
            System.out.print(v + " ");
        }
        System.out.println();
        System.out.println("===============");
    }

    public static void main(String[] arg) {
        int[] a = { 147999215698 };
        printAll(a);
        BinarySearchApp bs = new BinarySearchApp();
        System.out.println("result: " + bs.binarySearchForFirstEqual(a, a.length, 8));
        System.out.println("result: " + bs.binarySearchForLastEqual(a, a.length, 8));
        System.out.println("result: " + bs.binarySearchForFirstEqualOrGreater(a, a.length, 8));
        System.out.println("result: " + bs.binarySearchForFirstEqualOrSmaller(a, a.length, 8));

    }

}




以上是关于二分查找的主要内容,如果未能解决你的问题,请参考以下文章

java 二分查找法

代码题(12)— 二分查找

二分查找代码

PHP实现二分查找算法(代码详解)

「算法笔记」一文摸秃二分查找

C语言二分查找