二分查找算法思想
有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。
一个情景:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
二分查找优缺点
优点:
- 时间复杂度低: 二分查找的时间复杂度是 O(log n),相比线性搜索 O(n),在大型有序数据集上具有更高的效率。
- 简单清晰: 算法逻辑相对简单,易于理解和实现。
- 节省空间: 二分查找通常只需要很少的额外空间,主要用于存储左右边界、中间索引等变量。
缺点:
- 仅适用于有序数据: 二分查找要求数据集是有序的,如果数据集无序,需要先进行排序,这可能增加额外的时间复杂度。
- 不适用于链表: 二分查找需要随机访问,对于链表这样的数据结构,二分查找的效率较低,因为它无法直接跳到中间元素。
- 只能查找单一元素: 二分查找适用于查找单一元素的情况,如果需要查找多个匹配的元素,可能需要其他算法。
- 不适用于动态数据集: 如果数据集经常发生变化,频繁的插入和删除可能会导致数组重新排序,使得二分查找的优势减弱。
总体来说,二分查找是一种非常有用的算法,尤其适用于有序数据集的查找操作。然而,使用前需要考虑数据集的特点和操作需求,以确保选择最适合的算法。
以下是二分查找的详细步骤:
- 初始化左右边界:将初始查找范围设置为整个数组,即
left = 0
,right = array.length - 1
。 - 计算中间元素的索引:
mid = (left + right) / 2
。 - 检查中间元素是否是目标元素:
- 如果
array[mid] == target
,则找到目标元素,返回mid
。 - 如果
array[mid] < target
,说明目标元素在右半部分,更新left = mid + 1
。 - 如果
array[mid] > target
,说明目标元素在左半部分,更新right = mid - 1
。
- 重复步骤2和步骤3,直到找到目标元素或左边界大于右边界
实例: