基本算法(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

原文地址:https://www.cnblogs.com/duchaoqun/p/12695608.html