** 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。**
查找过程
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
算法要求
1.必须采用顺序存储结构。
2.必须安装大小有序的顺序结构
java代码:
1,如果是单数取中间
2,偶数取中间靠左边
public static void main(String[] args) {
int[] aa={1,5,8,11,19,22,31,35,40,45,48,49,50};//定义一个有序数组
int age=48;//需要获取的值
int length = aa.length;
for (int i = 0; i < aa.length; i++) {
int bb=((i+length)>>>1);//i+数值长度向右取余一位数相当于除2
if(aa[i]==age){//判断数组i是否等于要获取的值
System.out.println(i);
return;
}else if(age>aa[bb]){//判断获取的值是否大于中间的值,如果是大于那中间的值减一保证是单数,然后赋值个i从中间的值减一开始查找
i=bb-1;
}else {
length=bb+1;//判断获取的值是否小与于中间的值,如果小与索引长度+1
}
System.out.println(aa[bb]);//查看折半的数据
}
System.out.println("-1");//如果都没有找到返回-1
}
习题:
注意:
1,目前介绍的二分查找是以jdk中Arrays.binarySearch的实现作为讲解示范
2,但实际上二分查找有许多诸多的变化,一旦使用变体的实现代码,则左右边界的选取会有变化