二分查找法
二分查找的基本思想是:将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果xa[n/2],则只要在数组a的右半部搜索x. 折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是:(这里假设数组元素呈升序排列)将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止;如 果xa[n/2],则我们只要在数组a的右 半部继续搜索x。
/*
* 使用二分查找法的前提:数列是有序的,顺序存储结构 *
*
* 满足条件后采用折半的方式进行判断、查找,
*
* 折半数列,拿数列下标对应的元素与查找对象比较(默认数列为升序 小-->大)
* 个人总结:先折半,再判断,
*
*
*
*
*
*
*/
public class TwoFindWay {
public static void main(String[] args) {
int[]array =new int[] {1,5,7,9,11,20,29,99};//array.length=8
Boss boss =new Boss(array);
System.out.println(boss.find(6));
System.out.println(boss.find(1));
System.out.println(boss.find(99));
}
public static class Boss{
private int[] array;
/*
* 初始化数组
* @param array
*/
public Boss(int array[]) {
this.array=array;
}
/*
*
* 二分查找法的实现
* @param find
* @return
*
*/
public int find(int fd) {
if(array==null) {//空了就返回-1
return -1;
}
/*
* 定义开始结束下标,二分位置;
* @param start,end,mid;
*
*
*
*/
int start=0;
int end =array.length-1;
while(start<=end) {//使用while 在二分位置开始遍历,查找满足的下标元素
int mid =start+(end-start)/2;
if(array[mid]==fd) {
return mid;//找到了满足的下标元素返回数列 下标
}else if(fd<array[mid]) {
end =mid-1;//折半后 如果说比数列下标元素小,就左移一位下标,
}else {
start=mid+1;//反之,右移一位,
}
}
return -1;//找不到就返回0,
}
}
}
优点:速度较快,
缺点:使用门槛高。