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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值