二分查找(也称折半查找)是很常见的一种在数组中查找数据的算法,作为一名程序员是应该必须会的。它的基础思想:获取数组的中间值,将数组分割成两份,利用查找的值跟中间值进行比较,如果查找的值大于中间值,就在数组的右边进行查找;如果查找的值小于中间值,就在数组的左边进行查找。如此循环的执行下去,最终找到符合的值。

二分查找

优点:
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;

}

最新文章

  1. JavaWeb路径问题打包总结--小心出门右转404
  2. SQL存储过程-新增和修改,参数Xml数据类型
  3. 【LintCode】转换字符串到整数
  4. 本地替换文件读取MYSQL密码
  5. JS判断鼠标从什么方向进入一个容器
  6. ios开发——笔记篇
  7. 百度地图 - demo
  8. SQL server 如何附加、还原、分离、备份数据库文件
  9. OC - 28.模拟时钟
  10. jquery ajax 跨域提交(附IE浏览器解决方案)
  11. 根据checkBox或radio的勾选状态得到id数组
  12. MVC+Bootstrap设计
  13. Redis编码问题
  14. Struts第八篇【资源国际化、对比JSP的资源国际化】
  15. 《java.util.concurrent 包源码阅读》18 Exchanger
  16. rabbitmq高级消息队列
  17. @@ITENTITY
  18. Docker 部署应用、jar 工程 docker 方式部署
  19. GDI+配置
  20. [转帖]剖析淘宝TDDL(TAOBAO DISTRIBUTE DATA LAYER)

热门文章

  1. 如何让Oracle数据库保持优良性能的方法
  2. PS:将一个图片变成圆形
  3. Python动态类型简单介绍
  4. 【洛谷4459】[BJOI2018] 双人猜数游戏(动态规划)
  5. 数长方形有多少个?POJ(1693)
  6. MAC下查看环境变量的值的方法
  7. Django Reverse for &#39;artic_post&#39; with arguments &#39;()&#39; and keyword arguments &#39;{}&#39; not found. 0 pattern(s) tried: []
  8. 第36章 SDIO—SD卡读写测试—零死角玩转STM32-F429系列
  9. Large-scale Scene Understanding (LSUN)
  10. scp 远程拷贝