概念
在有序数组
中,查找目标值的位置
效果图
代码
public class BinarySearch {
public static void main(String[] args) {
//从方法,获取一个乱序数组
int[] a = suiJi();
//对a数组排序
Arrays.sort(a);//优化的快速排序
System.out.println(Arrays.toString(a));
while(true) {
System.out.print("查找的目标值:");
int t = new Scanner(System.in).nextInt();
//从a数组中,查找t的位置(二分法查找)
int index = binarySearch(a, t);
System.out.println(index);
}
}
private static int[] suiJi() {
//随机产生5+ [0,6)范围整数n
int n = 5+ new Random().nextInt(6);
//新建int[]数组,长度n
int[] a = new int[n];
//遍历数组,填入100内随机整数
for (int i = 0; i < a.length; i++) {
a[i] = new Random().nextInt(100);
}
return a;
}
private static int binarySearch(int[] a, int t) {
/*
* 0 mid 7
* [16, 21, 30, 36, 39, 70, 70, 92]
* lo hi
*
*/
int lo = 0;
int hi = a.length-1;
int mid;
while(lo <= hi) {
mid = (lo+hi) / 2;
if(a[mid] < t) {
lo = mid+1;
} else if(a[mid] > t) {
hi = mid-1;
} else {
return mid;
}
}
//避免lo是0,加1后,再加负号
return -(lo+1); // -(插入点+1)
}
}