二分查找是一种查询效率非常高的查找算法。又称折半查找。
二分查找算法思想
有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。
一个情景:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
二分查找图示说明
图片来源百度图片,感谢分享者
二分查找优缺点
优点是比较次数少,查找速度快,平均性能好;
其缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
使用条件:查找序列是顺序结构,有序。
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
来源:51CTO
作者:android攻城师
链接:https://blog.csdn.net/yxw_android/article/details/100915764