前言
二分(折半)查找(Binary Search),通过缩小查找区域来查找数据
- 查找序列是有序的(升序或者降序)
步骤
假设序列是升序的
- 取序列中间元素进行比较。
- 如果待查找元素x大于中间元素,说明x在中间元素右侧。
- 如果待查找元素x小于中间元素,说明x在中间元素左侧。
- 如果待查找元素x等于中间元素,查找成功。
- 重复上面步骤,直到查找成功或者失败
学习
计算公式:
()
比较次数:
当序列中包含n个元素的时候,查找失败时,至少比较a次关键字;查找成功时,最多比较关键字次数是b。
时间复杂度:while的执行次数
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