1、折半查找又称为二分查找,是一种效率较高的查找方法。
2、折半查找的前提条件:
查找表中的所有记录是按关键字有序(升序或降序) 。
查找过程中,先确定待查找数字在表中的范围,然后逐步缩小范围(每次将待查记录所在区间缩小一半),直到找到或找不到记录为止。
3、查找的算法可以简述为以下:
用Low、High和Mid表示待查找区间的下界、上界和中间位置指针,初值为Low=1,High=n。
⑴ 取中间位置Mid:Mid=(Low+High)/2;
⑵ 比较中间位置记录的关键字与给定的K值:
① 相等: 查找成功;
② 大于:待查记录在区间的前半段,修改上界指针:High=Mid-1;
③ 小于:待查记录在区间的后半段,修改下界指针:Low=Mid+1;
直到越界(Low>High),查找失败
4.代码演示
public class Homework {
static int []a = new int[5];//定义一个长度为5的一维数组
static Scanner sr = new Scanner(System.in);//调用输入类Scanner
public static void main(String[] args) {
iniArray();//给数组赋值
sortArray();//给数组排序
int a = sr.nextInt();
if(searchX(a)) {
//判断结果
System.out.println("True");
}
else System.out.println("false");
}
//给数组赋值
public static void iniArray(){
for (int i = 0; i <a.length ; i++) {
a[i] = sr.nextInt();
}
}
//给数组元素排序的代码
public static void sortArray(){
for (int i = 0; i < a.length-1; i++) {
//最后一个不用再比较,已经是最小的了
for (int j = 0; j < a.length-1-i; j++) {
//每次与a[i]比较,前面已经排好序的不用再排所以要减i,减1是因为不用跟自己比
if(a[j]>a[j+1]){
int b = a[j];
a[j] = a[j+1];
a[j+1] = a[j];
}
}
}
}
//以下为折半寻找法的具体代码
public static boolean searchX(int x){
int low = 0,height = a.length-1,middle = (low+height)/2;//首先定义low,height,middle对数组元素进行索引
while (low<=height){
//循环结束的条件是左边索引值大于右边索引值
if (x<a[middle]){
//如果寻找的x值小于数组中间值,则右端的height左移到原先的middle的左边
height = middle-1;
middle = (low+height/2); //然后再更新middle值
}
else if(x>middle){
//反之亦同
low = middle+1;
middle = (low+height)/2;
}
else return true;
}
return false;
}
}
如有需改进的地方欢迎看官指出