二分查找是一种查询效率非常高的查找算法。又称折半查找。
二分查找算法思想
有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。
一个情景:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
二分查找图示说明
图片来源百度图片,感谢分享者
二分查找优缺点
优点是比较次数少,查找速度快,平均性能好;
其缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
使用条件:查找序列是顺序结构,有序。
public static void main(String[] args) {
// write your code here
System.out.print("二分法算法 :");
int[] arr = {1,3,5,7,9,11};
int value = 5;
int index = binarySearch(arr,arr.length,value);
System.out.print("算法 :"+ index);
}
//二分法排序
static int binarySearch(int[] array, int size, int value) {
int lo = 0;
int hi = size - 1;
while (lo <= hi) {
final int mid = (lo + hi) >>> 1;
final int midVal = array[mid];
if (midVal < value) {
lo = mid + 1;
} else if (midVal > value) {
hi = mid - 1;
} else {
return mid; // value found
}
}
return ~lo; // value not present
}
~ 运算符的含义是取反
eg:
A = 0011 1100
~A= 1100 0011
>>> 运算符的含义是无符号右移
例如: 12 >>> 2 = 3
0000 0000 0000 0000 0000 0000 0000 1100 -> 12
0000 0000 0000 0000 0000 0000 0000 0011 -> 12 >>> 2 = 3
右移一位 就是取中间值
12 >>> 1 = 6
参考
https://blog.csdn.net/maoyuanming0806/article/details/78176957