二分查找iOS
二分查找(也称折半查找)是很常见的一种在数组中查找数据的算法,作为一名程序员是应该必须会的。它的基础思想:获取数组的中间值,将数组分割成两份,利用查找的值跟中间值进行比较,如果查找的值大于中间值,就在数组的右边进行查找;如果查找的值小于中间值,就在数组的左边进行查找。如此循环的执行下去,最终找到符合的值。
二分查找
优点:
1.速度快 2.比较次数少 3.性能好
缺点:
1.必须是一个有序的数组(升序或者降序)
2.适用范围:适用不经常变动的数组
在没使用算法之前时间复杂度是O(N),而在使用算法之后,时间复杂度就变成了O(logN)
NSArray * array1 = @[@3,@7,@9,@14,@25,@26,@37,@69];
NSInteger result = [self binarySearchTarget:@26 inArray:array1];//在这里打印结果看是否有相等的值
NSLog(@"%ld",(long)result);
// 在某个数组中搜索目标
- (NSInteger)binarySearchTarget:(NSInteger)target inArray:(NSArray *)arr{
if (arr.count < 1) {
//数组无元素,返回-1;
return -1;
}
// 定义三个变量 第一个值下标、中间值下标、最后一个值下标
NSInteger start = 0;
NSInteger end = arr.count - 1;
NSInteger mind = 0;
// 进行循环 // 数组中第一个对象和最后一个对象之前还有其他对象则进行循环
while (start < end - 1) {
//会有一些朋友看到有些人是( start + end ) / 2这样写的,但是这样写有一点不好,就是start+end会出现整数溢出的情况,如果存在溢出,你再除以2也是没有用的,所以不能这么写
mind = start + (end - start) / 2;
// 如果中间值大于目标值
if ([arr[mind] integerValue]> target) {
end = mind; // 中间值做为最后一个值,在前半段再进行相同的搜索
}else{
start = mind;
}
}
// 如果第一个值和目标值相等则获取第一个值的下标
if ([arr[start] integerValue] == target) {
return start;
}
// 如果最后一个值和目标值想等则获取最后一个下标
if ([arr[end] integerValue] == target) {
return end;
}
return -1;
}
最新文章
- JavaWeb路径问题打包总结--小心出门右转404
- SQL存储过程-新增和修改,参数Xml数据类型
- 【LintCode】转换字符串到整数
- 本地替换文件读取MYSQL密码
- JS判断鼠标从什么方向进入一个容器
- ios开发——笔记篇
- 百度地图 - demo
- SQL server 如何附加、还原、分离、备份数据库文件
- OC - 28.模拟时钟
- jquery ajax 跨域提交(附IE浏览器解决方案)
- 根据checkBox或radio的勾选状态得到id数组
- MVC+Bootstrap设计
- Redis编码问题
- Struts第八篇【资源国际化、对比JSP的资源国际化】
- 《java.util.concurrent 包源码阅读》18 Exchanger
- rabbitmq高级消息队列
- @@ITENTITY
- Docker 部署应用、jar 工程 docker 方式部署
- GDI+配置
- [转帖]剖析淘宝TDDL(TAOBAO DISTRIBUTE DATA LAYER)
热门文章
- 如何让Oracle数据库保持优良性能的方法
- PS:将一个图片变成圆形
- Python动态类型简单介绍
- 【洛谷4459】[BJOI2018] 双人猜数游戏(动态规划)
- 数长方形有多少个?POJ(1693)
- MAC下查看环境变量的值的方法
- Django Reverse for &#39;artic_post&#39; with arguments &#39;()&#39; and keyword arguments &#39;{}&#39; not found. 0 pattern(s) tried: []
- 第36章 	SDIO—SD卡读写测试—零死角玩转STM32-F429系列
- Large-scale Scene Understanding (LSUN)
- scp 远程拷贝