非递归实现:
import java.util.*;
public class BinarySearchDemo {
public static void main(String[] args) {
int []arr = new int[] {1 ,3, 5, 6, 6, 6, 8, 9, 20, 22, 29};
System.out.println(binarySearch(arr, 8));
System.out.println(binarySearch(arr, 1));
System.out.println(binarySearch(arr, 10));
System.out.println("--------------");
System.out.println(binarySearch1(arr, 6));
System.out.println(binarySearch1(arr, 10));
System.out.println(binarySearch1(arr, 1));
}
//arr数组中待查找的元素无重复值
public static int binarySearch(int []arr, int des) {
int left = 0;//左边界
int right = arr.length - 1;//右边界
while(left <= right) {
int mid = left + right >> 1;//中间值 >>:右移,相当于除以二
if(arr[mid] > des) {
right = mid - 1;
}else if(arr[mid] < des) {
left = mid + 1;
}else {
return mid;
}
}
return -1;
}
//arr数组中待查找的元素值不只有一个,返回list,其中存放des的索引
public static List<Integer> binarySearch1(int []arr, int des) {
List<Integer> ans = new ArrayList<>();
int left = 0;
int right = arr.length - 1;
while(left <= right) {
int mid = left + right >> 1;
if(arr[mid] > des) {
right = mid - 1;
}else if (arr[mid] < des) {
left = mid + 1;
}else {
int temp = mid - 1;
while(true) {
if(temp < 0 || arr[temp] != des) break;
ans.add(temp--);
}
ans.add(mid);
temp = mid + 1;
while(true) {
if(temp > arr.length - 1 || arr[temp] != des) break;
ans.add(temp++);
}
return ans;
}
}
return null;
}
}
程序输出:
6
0
-1
--------------
[4, 3, 5]
null
[0]
递归实现:
public class BinarySearchRecurionDemo {
public static void main(String[] args) {
int []arr = new int[] {1 ,3, 5, 6, 6, 6, 8, 9, 20, 22, 29};
System.out.println(binarySearchRecurion(arr, 0, arr.length - 1, 1));
System.out.println(binarySearchRecurion(arr, 0, arr.length - 1, 5));
System.out.println(binarySearchRecurion(arr, 0, arr.length - 1, 29));
}
public static int binarySearchRecurion(int []arr, int left, int right, int des) {
if(left > right) {
return -1;
}
int mid = left + right >> 1;
if(arr[mid] > des) {
return binarySearchRecurion(arr, left, mid - 1, des);
}else if(arr[mid] < des) {
return binarySearchRecurion(arr, mid + 1, right, des);
}else {
return mid;
}
}
}
程序输出:
0
2
10