关闭

二分搜索的拓展用法

标签: java算法二分搜索
303人阅读 评论(0) 收藏 举报
分类:

二分搜索的拓展用法

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

<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>


1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:102950次
    • 积分:2202
    • 等级:
    • 排名:第17170名
    • 原创:114篇
    • 转载:1篇
    • 译文:1篇
    • 评论:22条
    博客专栏
    最新评论