1.二分查找的实现原理
-
要求在一个有序数列中,查找指定的元素
-
注意:如果数列中的元素是对象类型,要求对象可以大小比较。
-
二分查找机制:
-
每次都找到当前数列的中间位置的元素,与待查找的元素比较
-
相等,找到了元素
-
不相等,如果待查找的元素比中间位置的元素小,就去左侧继续查找。 如果待查找的元素比中间位置的元素大,就去右侧继续查找
-
结束条件
-
找到元素,就停止查找
-
元素查找不存在时,就会对数列进行压缩
当数列的两个边界交叉时,表示已经没有元素了
-
-
0 1 2 3 4 5 6 7 8 9 数组下标
1 3 5 7 9 15 20 25 30 100 元素
找 15(这个元素)
第1次,找到中间位置 left=0 , right=9 , mid=(0+9)/2=4–> 9 < 15, 继续向右找
第2次,找到中间位置 left=5 , right=9 , mid=7–> 25>15 , 继续向左找
第3次,找到中间位置 left=5 , right=7 , mid=6—> 15=15 找到
找24
第1次,left=0,right=9,mid=4–>9<24 -->
第2次,left=5,right=9,mid=7—>25>24 <–
第3次 ,left=5,right6,mid=5—>15<24 -->
第4次,left=6,right6,mid=6—>20<24 -->
第5次,left=7,right=6,结束
return -left - 1 ;
2.二分查找的代码实现
public class BinarySearch {
public static void main(String[] args) {
int nums[] = {1,3,5,7,8,10,12,20,30,50,100};//定义一个数组
int i = BinarySearch(nums,12);//调用二分查找,查找12
System.out.println(i);//程序运行,输出结果为 6
}
public static int BinarySearch(int[] nums,int num){
//定义二分查找的方法,传入一个数组,传入一个整数表示想要查找的数字
int left = 0;//定义左边界
int right = nums.length-1;//定义右边界
while(true){
if(left>right){
return -left-1;
}
int mid = (right+left)/2;
int minNum =nums[mid];
if(minNum == num){
return mid;
}
if(num<minNum){
//继续向左找
right = mid-1;
}else{
//继续向右找
left =mid+1;
}
}
}
}