基本算法(01) - 二分查找

前言

二分(折半)查找(Binary Search),通过缩小查找区域来查找数据

  • 查找序列是有序的(升序或者降序)

步骤

假设序列是升序的

  1. 取序列中间元素进行比较。
  2. 如果待查找元素x大于中间元素,说明x在中间元素右侧。
  3. 如果待查找元素x小于中间元素,说明x在中间元素左侧。
  4. 如果待查找元素x等于中间元素,查找成功。
  5. 重复上面步骤,直到查找成功或者失败

学习

计算公式:
a<log2n<b (a,b,nZ+)

比较次数:
当序列中包含n个元素的时候,查找失败时,至少比较a次关键字;查找成功时,最多比较关键字次数是b。

时间复杂度:while的执行次数
O(h)=O(log2n)

Demo(Scala)

package info.aoye
object Test {
def main(args: Array[String]): Unit = {
val array = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 34, 67, 89, 90)
println(binarySearch(array, 1))
}
def binarySearch(array: Array[Int], x: Int): Int = {
if (array.isEmpty) {
println("Error: Empty array!")
}
var left = 0
var right = array.length - 1
val defResult = -1
while (left <= right) {
//val middle = left + (right - left) / 2
val middle = (right + left) / 2
println(right + ":" + left + ":" + middle)
if (x < array(middle)) {
right = middle - 1
} else if (x > array(middle)) {
left = middle + 1
} else {
return array(middle)
}
}
defResult
}
}

引用

https://www.2cto.com/kf/201608/534039.html
https://blog.csdn.net/qq_22238533/article/details/79218266
http://blog.51cto.com/clown5/1757249

posted @   duchaoqun  阅读(190)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示