二分查找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;
}
二分查找iOS的更多相关文章
- NYOJ-626-intersection set(二分查找)
题目链接 /* Name:NYOJ-626-intersection set Copyright: Author: Date: 2018/4/12 21:30:10 Description: 二分查找 ...
- UVA - 1152 4 Values whose Sum is 0问题分解,二分查找
题目:点击打开题目链接 思路:暴力循环显然会超时,根据紫书提示,采取问题分解的方法,分成A+B与C+D,然后采取二分查找,复杂度降为O(n2logn) AC代码: #include <bits/ ...
- POJ——3061Subsequence(尺取法或二分查找)
Subsequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11224 Accepted: 4660 Desc ...
- 数据结构实验7:实现二分查找、二叉排序(查找)树和AVL树
实验7 学号: 姓名: 专业: 7.1实验目的 (1) 掌握顺序表的查找方法,尤其是二分查找方法. (2) 掌握二叉排序树的建立及查找. 查找是软件设计中的最常用的运算,查找所涉及到 ...
- STL二分查找函数的应用
应用二分查找的条件必须是数组有序! 其中二分查找函数有三个binary_serch,upper_bound,lower_bound 测试数组 int n1[]={1,2,2,3,3,4,5}; int ...
- I Count Two Three(打表+排序+二分查找)
I Count Two Three 二分查找用lower_bound 这道题用cin,cout会超时... AC代码: /* */ # include <iostream> # inclu ...
- POJ 2182 Lost Cows (树状数组 && 二分查找)
题意:给出数n, 代表有多少头牛, 这些牛的编号为1~n, 再给出含有n-1个数的序列, 每个序列的数 ai 代表前面还有多少头比 ai 编号要小的牛, 叫你根据上述信息还原出原始的牛的编号序列 分析 ...
- LC T668笔记 & 有关二分查找、第K小数、BFPRT算法
LC T668笔记 [涉及知识:二分查找.第K小数.BFPRT算法] [以下内容仅为本人在做题学习中的所感所想,本人水平有限目前尚处学习阶段,如有错误及不妥之处还请各位大佬指正,请谅解,谢谢!] !! ...
- jvascript 顺序查找和二分查找法
第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...
随机推荐
- MySQL入门很简单: 3 操作数据库
登陆:mysq -u root -p 0409 1). 创建, 删除数据库 SHOW DATABASES; 显示已经存在的数据率 CREATE DATABASES 数据库名: 创建数据库 DROP D ...
- 如何查找BAPI SD_SALESDOCUMENT_CHANGE里的字段对应的数据库存储表
BAPI函数SD_SALESDOCUMENT_CHANGE可以让我们很方便地通过ABAP代码来修改Sales Order. 其输入参数ORDER_HEADER_IN的类型是BAPISDHD1, 里面包 ...
- 【[SDOI2017]新生舞会】
题目 好题啊 我们要求的是 \[C=\frac{\sum_{i=1}^na_i}{\sum_{i=1}^nb_i}\] 使得\(C\)最大 显然 \[C\times \sum_{i=1}^nb_i=\ ...
- 2018.8.2 Juint测试介绍及其命名的规范
JUnit - 测试框架 什么是 Junit 测试框架? JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量.JUnit 测试框架能够轻松完成以 ...
- 2017.11.6 JavaWeb-----第七章 JavaWeb常用开发模式与案例
JavaWeb-----第七章 JavaWeb常用开发模式与案例 (1)单纯的JSP页面开发模式 通过在JSP中的脚本标记,直接在JSP页面中实现各种功能.称为"单纯的JSP页面编程模式&q ...
- 20145238-荆玉茗 《Java程序设计》第9周学习总结
20145238第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 ...
- Node.js 的初体验
例子1: 1.首先第一步 :要 下载 node.js. 官网 上可以下载 下载完后,是这个玩意. 2. 打开 node.js ,然后输入 // 引入http模块 var http = require( ...
- jQuery序列化表单为JSON对象
<form id="myform"> <table> <tr> <td>姓名:</td> <td> < ...
- extjs3EmptyText 上传自动清空的问题
在extjs3表单的操作中,输入框经常有提示性的默认字段,比如: // === 接入单位的Form表单 ====== var jrdwForm = new Ext.form.FormPanel({ b ...
- SpringBoot学习5:访问静态资源
springboot默认从项目的resources里面的static目录下或者webapp目录下访问静态资源 方式一:在resources下新建static文件(文件名必须是static) 在浏览器中 ...