算法 - 查找 - 二分查找 (Binary Search)

本文介绍如何使用C++实现通用的二分查找算法模板,适用于有序顺序表,详细阐述了整型查找、模板查找以及如何处理自定义类型。通过提供比较函数指针,实现了对不同数据类型的查找,简化了代码并提高了可复用性。
摘要由CSDN通过智能技术生成

算法 - 查找 - 二分查找 (Binary Search)

返回分类:全部文章 >> 基础知识

返回上级:算法 - 查找与排序 (Searching and Sorting)

本文将用C++实现通用模板二分查找算法,复制代码直接可使用。

在查看本文之前,需要一些程序语言的基础。



1 二分查找简述 (Introduction)

二分查找,又叫折半查找,它只适用于有序顺序表。其时间复杂度 O(log2n) 。

假设表中有 n 个元素,查找过程为取区间中间元素的下标 mid ,对 mid 的关键字与给定值的关键字比较:

  • (1)如果与给定关键字相同,则查找成功,返回在表中的位置;

  • (2)如果给定关键字大,则更新左区间起始位置等于 mid + 1 ,即向右查找;

  • (3)如果给定关键字小,则更新右区间起始位置等于 mid - 1 ,即向左查找;

  • (4)重复过程,直到找到关键字(成功)或区间为空集(失败)。

通常情况下:

  • 返回值,代表下标;

  • 返回-1,代表没有找到关键字;

n = 2 h − 1 n=2^h-1 n=2h1 (h 为二叉树高)时,其判定树为满二叉树时,查找成功平均查找长度为:

A S L s u c c = 1 n [ ( n + 1 ) log ⁡ 2 ( n + 1 ) − n ] ≈ log ⁡ 2 ( n + 1 ) − 1 {ASL}_{succ} = \frac{1}{n} \left[ (n+1)\log_2 (n+1) -n \right] \approx \log_2 (n+1) - 1 ASLsucc=n1[(n+1)log2(n+1)n]log2(n+1)1

n &lt; 2 h − 1 n&lt;2^h-1 n<2h1

  • 其高度为

    h = ⌈ log ⁡ 2 ( n + 1 ) ⌉ h= \lceil \log_2(n+1) \rceil h=log2(n+1)

  • 查找成功平均查找长度为:

A S L s u c c = 1 n [ h × ( n + 1 ) + 1 − 2 h ] {ASL}_{succ} = \frac{1}{n} \left[ h \times (n+1) +1 - 2^h \right] ASLsucc=n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值