package bi.shi.demo01;
import org.junit.Test;
/**
* @program: bi_shi_test
* @description: 写一个折半查找算法
* 搜索过程从数组的中间元素开始,
* 如果中间元素正好是要查找的元素,
* 则搜索过程结束;
* 如果某一特定元素大于或者小于中间元素,
* 则在数组大于或小于中间元素的那一半中查找,
* 而且跟开始一样从中间元素开始比较。
* 如果在某一步骤数组为空,
* 则代表找不到。
* 这种搜索算法每一次比较都使搜索范围缩小一半
* @author: xin yi
* @create: 2021-09-12 13:42
*/
public class Demo01 {
/**
* ① 首先确定整个查找区间的中间位置 mid = (left + right)/2 。
* ② 用待查关键字值与中间位置的关键字值进行比较;若相等,则查找成功;若大于,则在后(右)半个区域继续进行折半查找;若小于,则在前(左)半个区域继续进行折半查找。
* ③ 对确定的缩小区域再按折半公式,重复上述步骤。最后,得到结果:要么查找成功, 要么查找失败。折半查找的存储结构采用一维数组存放.
*/
@Test
public void demo01(){
int arr[] =new int[]{2,4,6,8,10,12,14,16,18,20,22};
System.out.println(zhebanFind(arr,2));
System.out.println(zhebanFind(arr,14));
System.out.println(zhebanFind(arr,20));
System.out.println(zhebanFind(arr,22));/*有问题问题链接:https://ask.csdn.net/questions/7507646*/
}
private int zhebanFind(int[] arr, int key) {
int maxArr = arr.length-1; /*设置最大下标*/
int minArr = 0; /*设置最小下标*/
int midArr = (maxArr + minArr)/2; /*设置中间下标*/
for (int i = 0; i < arr.length; i++) {
if (arr[midArr] > key){ /*数组中间下标值比key大时,说明key在数组的前半段*/
maxArr = midArr; /*重新设置最大下标*/
midArr = midArr/2; /*重新设置最小下标*/
}else if (arr[midArr] < key){ /*数组中间下标值比key小时,说明key在数组的后半段*/
minArr = midArr; /*重新设置最小下标*/
midArr = (minArr + maxArr)/2; /*重新设置最大下标*/
}else {
break;
}
}
return midArr;
}
}