二分搜索的拓展用法
二分搜索想必大家比较熟悉了,这里给出两道二分搜索的变形的题目。
<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>