您的位置:首页 > 职场人生

程序员的算法课(4)-二分查找

2019-08-20 22:01 141 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/m0_37609579/article/details/99888976

一个90%的程序员写不对的程序,一个面试高频出现的面试题,一个开发中用之甚广的算法,一个最能体现程序员素质的代码,它就是二分查找。

一、二分查找的定义

【百度百科】二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

二分查找法充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是:(这里假设数组元素呈升序排列)将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止;如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x;如果x>a[n/2],则我们只要在数组a的右 半部继续搜索x。

二、二分查找的实现

[code]//二分查找普通实现
public static int binarySearch(Integer[] srcArray, int des) {
//定义初始最小、最大索引
int start = 0;
int end = srcArray.length - 1;
//确保不会出现重复查找,越界
while (start <= end) {
//计算出中间索引值
int middle = (end + start)>>>1 ;//防止溢出
if (des == srcArray[middle]) {
return middle;
//判断下限
} else if (des < srcArray[middle]) {
end = middle - 1;
//判断上限
} else {
start = middle + 1;
}
}
//若没有,则返回-1
return -1;
}
[code]    /**
* 二分查找递归实现。
* @param srcArray  有序数组
* @param start 数组低地址下标
* @param end   数组高地址下标
* @param key  查找元素
* @return 查找元素不存在返回-1
*/
public static int binSearch(int srcArray[], int start, int end, int key) {
int mid = (end - start) / 2 + start;
if (srcArray[mid] == key) {
return mid;
}
if (start >= end) {
return -1;
} else if (key > srcArray[mid]) {
return binSearch(srcArray, mid + 1, end, key);
} else if (key < srcArray[mid]) {
return binSearch(srcArray, start, mid - 1, key);
}
return -1;
}

三、二分查找的工作原理

  • 将数组分成两半,并确定要查找的内容(称为搜索键)是在左半部分还是在右半部分。
  • 你如何确定搜索关键字是哪一半?这就是为什么您首先对数组进行排序的原因,以便您可以进行简单
    <
    >
    比较。
  • 如果搜索键位于左半部分,则重复该过程:将左半部分分成两个更小的部分,然后查看搜索键必须位于哪个部分。(同样,当它是右半边时。)
  • 这一直重复直到找到搜索关键字。如果阵列无法再分割,您必须遗憾地断定搜索键不在阵列中。

现在你知道它为什么称为“二分”查找:在每一步中,它将数组分成两半。这个分而治之的过程就是让它能够快速缩小搜索关键字的位置。

我的微信公众号:架构真经(关注领取免费资源)

参考资料:

  1. https://baike.baidu.com/item/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE/10628618?fr=aladdin
  2. https://www.geek-share.com/detail/2609584641.html
  3. https://www.jianshu.com/p/0f823fbd4d20
  4. https://www.jianshu.com/p/31663d8dd912
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: