注意: 二分查找必须先排好顺序
import java.util.Scanner;
public class Main {
//查找数字p在a[]数组中的位置,size为数组长度
//如果找到了,则返回数组下标,如果找不到则返回-1
public static int BinarySearch(int a[],int size,int p){
int L = 0; //查找区间的左端
int R = size - 1; //查找区间的右端
while(L <= R){ //如果查找区间不为空就继续查找
int mid = L + (R-L)/2; //要写成这种形式 防止R和L过大溢出
//int mid = (R + L)/2; 取查找区间正中元素的下标
if(p == a[mid]){
return mid;
}else if(p > a[mid]){
L = mid + 1; //设置新的查找区间的左端点
}else{
R = mid - 1; //设置新的查找区间的右端点
}
}
return -1;
}
//查找在a[]数组中,比数字p小且下标最大的数的位置
public static int LowerBound(int a[], int size, int p){
int L = 0;
int R = size - 1;
int lastPos = -1;
while(L <= R){
int mid = L + (R-L)/2;
if(a[mid] >= p){
R = mid - 1;
}else{
lastPos = mid;
L = mid + 1;
}
}
return lastPos;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for(int i = 0; i < n; i++){
a[i] = sc.nextInt();
}
System.out.println(BinarySearch(a,n,1));
System.out.println(LowerBound(a,n,4));
}
}
4267

被折叠的 条评论
为什么被折叠?



