1,循环实现
public class 二分查找法_01 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
int[] arr = new int[100000000];
for (int i = 0; i < 100000000; i++) {
arr[i] = i;
}
二分查找法_01 instance = new 二分查找法_01();
Integer result = instance.find(arr,17);
System.out.println(result);
long end = System.currentTimeMillis();
System.out.println("花费时间 = " + (end - start) );
}
public Integer find(int[] arr, int target){
int low = 0;
int high = arr.length;
int count = 0;
while (low <= high){
count++;
System.out.println("查找次数" + count);
int mid = (low + high) / 2;
int guess = arr[mid];
if(target == guess){
return guess;
}
if(target < guess){
high = mid - 1;
}else {
low = mid + 1;
}
}
return null;
}
}
2,递归方式实现
public Integer find(int[] arr, int low, int high, int target){
if(low <= high){
int mid = (low + high)/2;
int guess = arr[mid];
if(target < guess){
return find(arr, low, mid - 1, target);
}
if(target > guess){
return find(arr, mid + 1, high, target);
}
return guess;
}
return null;
}
两种算法:
- mid=(low+high)/2
- mid=low+(high-low)/2
第二种可防溢出,保证计算出来的mid,一定大于low,小于high,不存在溢出的问题。
二分查找法的缺点:
因为需要有序数组,但是数组的删除插入效率不高,在无序数组构建有序数组的过程中效率较低,
可使用平衡二叉树、二叉树