Swift - 二分查找算法

醒脑图,给我自己看的

思想

顾名思义,二分查找就是将数组每次劈开一半,分为两个部分,然后判断需要查找的数据在那一部分,再对这部分数据劈开一半,如此重复...。二分查找算法要求待查数组为有序数组。

步骤

假设待查数据源list是一个有序数组
1. 确定待查数组或子数组的开始位置start(每次递归会根据情况变化)
2. 确定待查数组或子数组的结束位置end(每次递归会根据情况变化)
3. 确定待查数组的中值位置middle = (start + end)/2 (每次递归会根据情况变化)
4. 递归上面的操作,结束条件为start和end重合,如果找了整个数组都没有这个结果,返回-1,结束递归

看下面代码中的注释吧,清晰明了

代码

import UIKit

var str = "Hello,man"

var list = [Int]()//待查随机模拟数组
var item = 0
//造一个有十个元素的模拟数据数组
for i in 0..<10 {
    item = item + Int(arc4random_uniform(UInt32(20)));
    list.append(item)
}

//随机一个元素
let targetNum = list[Int(arc4random_uniform(UInt32(10)))]
print("原始数组为: \(list) 目标数字为: \(targetNum)")
//compareTimes : 记录比较次数
var compareTimes = 0
//result : 记录结果
var result = binarySearch(targetNum,list)
print("搜索结果: \(result) 比较次数 : \(compareTimes)")

/// 二分查找法
///
/// - Parameters:
/// - targetNum: 目标数字
/// - sourceList: 原始数组
/// - Returns: 目标数值在原始数组中的位置
func binarySearch(_ targetNum:Int,_ sourceList:[Int]) -> Int{
    var start = 0
    var end = sourceList.count - 1
    //只要没有指向同一个数,则继续查找
    while start <= end {
        compareTimes += 1
        //取中值
        var middle = (start + end)/2
        print("----第\(compareTimes)次比较的中值为\(sourceList[middle])")
        //如果中值等于目标值,直接返回中值index
        if targetNum == sourceList[middle] {
            return middle
        }
        //如果目标小于中值.说明在前半段
        if targetNum < sourceList[middle] {
            end = middle - 1
        }
        //如果目标大于中值.说明在后半段
        if targetNum > sourceList[middle] {
            start = middle + 1
        }
    }
    //没有找到
    return -1
}

结果

特性

查找算法 时间复杂度
二分查找算法 log2n

其他

我搭建的技术blog,详细请前往: www.livefor.cn

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...