改造二分算法实现搜索区间位置
假设现在一个数组有 10 20 30 40
那么 1 在那个区间 70在那个区间
改造点
对于二分计算到边界时候的处理
代码
/**
* 开始
*/
public static void main(String[] args) {
List<A> list = new ArrayList<>();
Integer c = 0;
//数组列表
for (int i = 0; i < 100; i++) {
A a = new A();
c = c+1;
a.setId(c);a.setUrl("A"+(c));
list.add(a);
}
//i在数组的那个区间
for (int i = 1; i <= 100; i++) {
int number = bsearchPosition(list,i);
System.err.println(i+"__"+list.get(number).getUrl());
}
}
/**
* 搜索位置
* @param list
* @param key
* @return
*/
public static int bsearchPosition(List<A> list, int key) {
int low = 0;
int high = list.size() - 1;
int mid = 0;
while (low <= high) {
int two = (high - low) / 2;
mid = low + two;
Integer position = list.get(mid).getId();
//边界
if (0 == two){
if (position > key){
if (0 == mid){
return mid;
}
high = mid - 1;
continue;
}
if (position < key){
if (list.size()-1 == mid){
return mid;
}
low = mid + 1;
if (low > high){
return mid + 1;
}
continue;
}
}
if (position == key){
return mid;
}
if (low == mid){
return mid;
}
if (position > key){
if (0 == mid){
return mid;
}
high = mid - 1;
continue;
}
if (list.size()-1 == mid){
return mid;
}
low = mid + 1;
}
return mid;
}
@Data
static class A{
private Integer id;
private String url;
}