二分搜索的拓展用法

二分搜索的拓展用法

二分搜索想必大家比较熟悉了,这里给出两道二分搜索的变形的题目。

<span style="font-size:18px;">public class BinarySearch {
	/*
	 * 题目一:
	 * 给定一个未排序的数组,使用二分搜索的方法查找其中最大的那个数(求最小的方法一样)
	 */
	/**
	 * 
	 * @param a 要查找的最大值所在的数组
	 * @param n 数组的最大范围
	 * @param st 要查找的开始坐标
	 * @param end 要查找的终结坐标
	 * @return 最大值
	 */
	private static int search(int[] a,int n,int st,int end){
		if(n==1){
			return a[st];
		}
		int mid = (st+end)/2;
		int num1 = search(a,n-n/2, st, st+mid);
		int num2 = search(a, n/2,mid+1, end);
		return num1>num2?num1:num2;
	}
	/*
	 * 题目二:
	 * 设a[0:n-1]是已排好序的数组。改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素的位置j。
	 * 当搜索元素在数组中时,i和j相同,均为x在数组中的位置
	 */
	static int i,j;
	/**
	 * 
	 * @param a 已经排好序的数组
	 * @param n 数组中元素的个数
	 * @param x 要查找的数
	 */
	private static void search2(int[] a,int n,final int x){
		int left=0;
		int right = n-1;
		while(left<=right){
			int middle = (left+right)/2;
			if(x==a[middle]){
				i = j = middle;
				return;//找到了该元素即结束查找
			}else if(x>a[middle]){
				i = middle;
				left = middle+1;
			}else{
				j = middle;
				right = middle-1;
			}
		}
	}
	public static void main(String[] args){
		/*************题目一*****************/
		int[] a = {3,1,7,5,9};
		int max = search(a,4, 0, 4);
		System.out.println(max);
		/*************题目二*****************/
		int[] b = {1,4,6,9,13,16};
		search2(b, 6, 8);
		System.out.println("i="+i+" j="+j);
	}
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值