二分查找算法

匿名 (未验证) 提交于 2019-12-03 00:08:02
二分查找是一种查询效率非常高的查找算法。又称折半查找。

二分查找算法思想
有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。
一个情景:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

二分查找图示说明

图片来源百度图片,感谢分享者

二分查找优缺点

优点是比较次数少,查找速度快,平均性能好;
其缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

使用条件:查找序列是顺序结构,有序。

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!