题目:设 a [ 0 : n - 1 ] 是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素 x 不在数组中时,返回小于 x 的最大元素的位置 i 和大于 x 的最小元素位置 j 。当搜索元素在数组中时, i 和j相同,均为 x 在数组中的位置。并对自己的程序进行复杂性分析。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int x;// 需要查找的数据
// 形参i,j是数组下标,arr是原数组,answer是存储答案的数组
static void getij(int i, int j, int[] arr, int[] answer) {
if (i > j) {
// x不在数组中的情况
answer[0] = j;
answer[1] = i;
return;
}
int len = j - i + 1;// 加不加1都可以
if (x == arr[len / 2 + i]) {
// x在数组中的情况
Arrays.fill(answer, len / 2 + i);// java api 方法,作用是将数组answer里的元素都赋值为len/2+1
} else if (x < arr[len / 2 + i]) {
getij(i, len / 2 + i - 1, arr, answer);
} else {
getij(len / 2 + i + 1, j, arr, answer);
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = scanner.nextInt();
}
x = scanner.nextInt();
// 答案 存储的是数组下标 i = answer[0]; j = answer[1]
int[] answer = new int[2];
getij(0, n - 1, arr, answer);// 0,n-1都是数组的下标
System.out.println(answer[0] + " " + answer[1]);
}
scanner.close();
}
}原文:http://blog.csdn.net/u011506951/article/details/34932895