【数据结构与算法 - Swift实现】11 - 二分查找 (Bi

2019-05-07  本文已影响0人  Lebron_James

二分查找是高效搜索算法中的一员,时间复杂度为O(log n)。使用搜索算法前,需要满足两个条件:

实现

假设要查找的元素为 A,集合从小到大的顺序排列,二分查找的步骤如下:

实现代码如下:

extension RandomAccessCollection where Element: Comparable {
    func binarySearch(for value: Element,
                      in range: Range<Index>? = nil) -> Index? {
        
        let range = range ?? startIndex..<endIndex
        guard range.lowerBound < range.upperBound else { return nil }
        
        let size = distance(from: range.lowerBound, to: range.upperBound)
        let middle = index(range.lowerBound, offsetBy: size / 2)
        let middleValue = self[middle]
        
        if middleValue == value {
            return middle
            
        } else if value < middleValue {
            return binarySearch(for: value, in: range.lowerBound..<middle)
            
        } else {
            return binarySearch(for: value, in: middle..<range.upperBound)
        }
    }
}

代码解析:

测试如下:

let array = [0, 9, 13, 20, 21, 25, 35, 120, 250]

let indexOf = array.index(of: 20)
let binarySearchFor = array.binarySearch(for: 20)

print("index(of:): \(String(describing: indexOf))")
print("binarySearch(for:): \(String(describing: binarySearchFor))")

// 结果
index(of:): Optional(3)
binarySearch(for:): Optional(3)

完整代码 >>

参考资料

Data Structures and Algorithms in Swift --- raywenderlich.com,如果想看原版书籍,请点击链接购买。

欢迎加入我管理的Swift开发群:536353151

下一篇文章:【数据结构与算法 - Swift实现】12 - 时间复杂度为O(n^2)的排序算法

上一篇 下一篇

猜你喜欢

热点阅读