二分查找--双调查找

2020-08-10  本文已影响0人  编程小王子AAA

双调查找:
如果一个数组中的所有元素是先递增后递减的,则称这个数组为双调的。编写一个程序,给定一个含有N 个不同int 值的双调数组,判断它是否含有给定的整数。

private static int findNum(int[] N, int key) {
        int l = 0;
        int r = N.length - 1;
        int aims = 0;
        //找最大值
        while (l < r) {
            aims = l + ((r - l) >> 1);
            if (N[aims] > N[aims - 1] && N[aims] < N[aims + 1]) {
                l = aims;
            } else if (N[aims] < N[aims - 1] && N[aims] > N[aims + 1]) {
                r = aims;
            } else {
                break;
            }
        }
        //左边
        int left = 0;
        int right = aims;
        int mid;
        while (left <= right) {
            mid = left + ((right - left) >> 1);
            if (N[mid] > key) {
                right = mid - 1;
            } else if (N[mid] < key) {
                left = mid + 1;
            } else {
                return mid;
            }
        }
        //右边,大小反过来排列,和上面不一样
        left = aims;
        right = N.length - 1;
        while (left <= right) {
            mid = left + ((right - left) >> 1);
            if (N[mid] < key) {
                right = mid - 1;
            } else if (N[mid] > key) {
                left = mid + 1;
            } else {
                return mid;
            }
        }
        return -1;
    }
上一篇 下一篇

猜你喜欢

热点阅读