二分查找(折半查找)算法

188 阅读2分钟

一、基本概念

  • 折半查找的算法通常被称为二分查找(Binary Search)
  • 二分查找是一种高效的查找算法,适用于已经排好序的数据集合,通过每次将查找范围减半来快速定位目标元素的位置。

二、基本思想如下:

  1. 找到数组的中间元素。
  2. 将中间元素与目标元素进行比较。
  3. 如果中间元素等于目标元素,则查找成功,返回中间元素的位置。
  4. 如果中间元素大于目标元素,说明目标元素可能在左半部分,将查找范围缩小到左半部分。
  5. 如果中间元素小于目标元素,说明目标元素可能在右半部分,将查找范围缩小到右半部分。
  6. 重复上述步骤,直到找到目标元素或者查找范围为空。

二分查找的时间复杂度为 O(log2n),其中 n 是数据集合的大小。这使得它在大规模数据中定位元素非常高效。

以下是一个简单的用 Swift 实现的二分查找算法:

/// Mark - 折半查找二分查找

///array  查找的数组
///target  目标元素
///-> Int?  返回目标元素的索引

func binarySearch(_ array: [Int], target: Int) -> Int? {

    var left = 0//起始位置
    var right = array.count - 1//数组的总个数

    while left <= right {

        let mid = left + (right - left) / 2

        let obj = array[mid] //根据索引取出元素

        if obj == target {

            return mid

        } else if obj < target {

            left = mid + 1

        } else {

            right = mid - 1

        }
    }
    return nil // 目标元素不在数组中
}

let sortedArray = [1, 3, 5, 7, 9, 11, 13, 15, 17]

if let index = binarySearch(sortedArray, target: 9) {
    print("目标元素在索引 \(index) 处。")
} else {
    print("目标元素不在数组中。")

}

在这段代码中,binarySearch 函数接受一个已排序的整数数组和目标元素作为参数。通过不断调整 leftright 指针来缩小查找范围,直到找到目标元素或确定不存在。如果找到目标元素,函数返回其索引;如果不存在,返回 nil