二分查找又称折半查找,意思就是把内容切成两半,分开来查找,但记住,使用二分查找的前提是表是有序表!
当表中内容较多时,二分查找比起顺序查找可以大大减少查询次数,提高效率,但是做插入和删除操作时会比较困难。
二分查找的实现原理是让表中间位置的数与关键字比较,如果两者相等,则查找成功,不相等的话则根据中间位置的记录将表切开分成前、后两个部分,如果中间位置记录的数大于关键字,则进入后半部分再二分查找,如果中间位置记录数小于关键字,则进入前半部分再二分查找,至到找到中间位置数与关键字相同的位置记录或者没有所要查找的数。
下面是Java代码的实现:
import java.util.Scanner;
public class BinSearch {
/**
* 执行二分算法,如果等于中间值则返回
* 如果小于中间值则向前半部分继续循环执行
* 如果大于中间值则向后半部分继续循环执行
* 直到找到一个中间值与need相等返回
*/
public static int binSearch(int[] array, int need) {
int low = 0;
int high = array.length - 1;
int middle = 0;
while (low <= high) {
middle = (low + high) / 2;
if (need == array[middle]) {
//由于low high middle都是基于数组下标的运算 返回关键字真实位置时我们应该+1
return middle+1;
} else if (need < array[middle]) {
high = middle - 1;
} else {
low = middle + 1;
}
}
return -1;
}
//主方法
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] a ={2,5,11,13,21,23,26,30};
System.out.println("请输入所要查找数");
int c = sc.nextInt();
int end = binSearch(a,c);
if(-1!=end){
System.out.println("所要查找的数所在位置为:"+end);
}else{
System.out.println("不存在所要查找的数字");
}
}
}
输出结果如下图所示: