醒脑图,给我自己看的
思想
顾名思义,二分查找就是将数组每次劈开一半,分为两个部分,然后判断需要查找的数据在那一部分,再对这部分数据劈开一半,如此重复...。二分查找算法要求待查数组为有序数组。
步骤
假设待查数据源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
原文链接:https://www.f2er.com/swift/321191.html