二分搜索的拓展用法

来源:互联网 发布:中科院算法答案 编辑:程序博客网 时间:2024/05/21 18:45

二分搜索的拓展用法

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

<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
原创粉丝点击