algorithm 1.4.20 Bitonic search

题目:

An array is bitonic if it is comprised of an increasing sequence of integers followed immediately by a decreasing sequence of integers. Write a program that, given a bitonic array of N distinct int values, determines whether a given integer is in the array. Your program should use ~3lg N compares in the worst case.


思路:

1、按照二分查找;

2、确认mid的值是处在递增序列还是递减序列,或者是中间点;

3、如果是在递增序列,target > arry[mid],那么可以去除mid左边的数据,直接递归在右边的双调数组中查找,否则需要在左边部分进行递增数组查找;

4、如果是在递减序列,target < arry[mid],那么可以在mid左边的部分进行双调数组查找,否则还需要在右半部份进行递减数组二分查找;

5、如果mid恰好是分界点,那么在左右数组分别进行递增数组和递减数组二分查找;


代码:

package com.frozenxia.algorithm.basic.exercises;

public class Bitonicsearch {
	public int search(int[] arry, int target) {
		int start = 0;
		int end = arry.length - 1;
		while (start <= end) {
			int mid = (start + end) / 2;
			if (arry[mid] == target) {
				return mid;
			} else if ((mid - 1) >= 0 && (arry[mid - 1] > arry[mid])) {
				if (arry[mid] > target) {
					int cr = decreasing_search(arry, mid + 1, end, target);
					if (cr != -1)
						return cr;
				}
				end = mid - 1;
			} else if (mid + 1 < arry.length && arry[mid + 1] > arry[mid]) {
				if (arry[mid] > target) {
					int cr = increasing_search(arry, start, mid - 1, target);
					if (cr != -1)
						return cr;
				}
				start = mid + 1;
			} else if (mid == 0) {
				start = mid + 1;
			} else if (mid == arry.length - 1) {
				end = mid - 1;
			} else {
				int cr = increasing_search(arry, start, mid - 1, target);
				if (cr != -1)
					return cr;
				cr = decreasing_search(arry, mid + 1, end, target);
				if (cr != -1)
					return cr;
				return -1;
			}
		}
		return -1;
	}

	public int increasing_search(int[] arry, int start, int end, int target) {
		// System.out.println("increasoing");
		while (start <= end) {
			int mid = (start + end) / 2;
			if (arry[mid] == target)
				return mid;
			if (arry[mid] < target) {
				start = mid + 1;
			} else {
				end = mid - 1;
			}
		}
		return -1;
	}

	public int decreasing_search(int[] arry, int start, int end, int target) {
		while (start <= end) {
			int mid = (start + end) / 2;
			if (arry[mid] == target)
				return mid;
			if (arry[mid] > target) {
				start = mid + 1;
			} else {
				end = mid - 1;
			}
		}
		return -1;
	}

	public static void main(String[] args) {
		int[] arry = { 12, 14, 17, 18, 19, 16, 15, 13, 12, 8, 7, 6, 5, 4 };
		Bitonicsearch bs = new Bitonicsearch();
		 System.out.println(bs.search(arry, 125 ));
		for (int i : arry) {
			System.out.println(bs.search(arry, i));
		}
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值