OC版二分查找

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

二分查找优点:1.速度快 2.比较次数少 3.性能好  当然了,缺点也很明显:1.必须是一个有序的数组(升序或者降序) 2.适用范围:适用不经常变动的数组

上源代码:

- (void)viewDidLoad {
    [super viewDidLoad];

   NSArray * array1 = @[@1,@2,@3,@4,@5,@6,@7,@9];

    int result = [self compare:array1 target:@9];
    //在这里打印结果看是否有相等的值
    NSLog(@"%d",result);
}

- (int)compare:(NSArray *)array target:(int)target{

    if (!array.count) {
        return -1;
    }

   unsigned int low = 0;
   unsigned int high = array.count - 1;

    while (low <= high) {
        //会有一些朋友看到有些人是( low + high ) / 2这样写的,但是这样写有一点不好,就是low+high会出现整数溢出的情况,如果存在溢出,你再除以2也是没有用的,所以不能这么写
        int mid = low + ((high - low)/2);

        //第mid项的内容
        int num = [array objectAtIndex:mid];

        if (target == num) {
            return low;
        }else if (num > target){
            high = mid - 1;//左边进行查找
        }else{
            low = mid +1;//右边进行查找
        }
    }
    return -1;//返回-1是没找到
}

好了,简单的介绍二分查找,如果有错误,请加以指正。

时间: 2024-07-30 10:06:17

OC版二分查找的相关文章

Pythonic版二分查找

前提:升序数组,待查元素在数组中. 二分查找:就是一个递归函数c.待查元素a,当前数组中位数b,如果b=a则返回b的索引,b>a则在b左侧的子数组中调用函数c,否则在b右侧子数组中调用函数c. 第一次思考,按着上面的思路编程后的结果: def binary_search(index, a, value): if a[(len(a) - 1) // 2] == value: return index + (len(a) - 1) // 2 elif a[(len(a) - 1) // 2] <

二分查找

递归版(在区间[x, y)中找v的位置) 1 //递归版二分查找 2 int bsearch(int * A, int x, int y, int v) 3 { 4 5 if(v<a[x] || v>a[y-1]) return -1; 6 int m = x + (y-x)/2; //此处能不能用int m = (x+y)/2,需要仔细考虑(暂时想不到原因) 7 if(A[m]==v) return m; 8 else if(A[m]>v) return bsearch(A, x, m

列表查找以及二分查找

列表查找:从列表中查找指定元素 输入:列表.待查找元素 输出:元素下标或未查找到元素 list1=[1,3,4,5,6,8,9,12,15,20] print(list1.index(8)) def listSearch(list,num): i=0 while i<len(list)-1: if list[i]==num: return i else: i=i+1 return None 二分查找 二分查找的前提是列表是有序的 def search(arr,num): low=0 high=l

程序员,你应该知道的二分查找算法

原理 二分查找(Binary Search)算法,也叫折半查找算法.二分查找的思想非常简单,有点类似分治的思想.二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0. 为了方便理解,我们以数组1, 2, 4, 5, 6, 7, 9, 12, 15, 19, 23, 26, 29, 34, 39,在数组中查找26为例,制作了一张查找过程图,其中low标示左下标,high标示右下标,mid标示中间值下标 二分查

9-2-折半查找/二分查找-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第9章  查找 - 折半查找/二分查找 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Base.c        相关测试数据下载  链接? 数据包      

二分查找递归版以及书写递归的注意事项

采用递归的方法实现二分查找. 在一个有序数组list中,从下标1开始,查看target是否在数组中.在的话就返回下标,否则返回0. 思路 1.对线性表排序,通常是由小到大排序. 2.取中间值与目标值比较. 2.1取中间值与目标值比较,若相等,则返回下标,退出函数. 2.2中间值比目标值要大,那么在最小值和中间值之间继续查找,执行2. 2.3中间值比目标值要小,那么在最大值和中间值之间继续查,执行2. 第一版(错误) int recursive_bin_ser(int* list, int len

深入浅出数据结构C语言版(12)——从二分查找到二叉树

在很多有关数据结构和算法的书籍或文章中,作者往往是介绍完了什么是树后就直入主题的谈什么是二叉树balabala的.但我今天决定不按这个套路来.我个人觉得,一个东西或者说一种技术存在总该有一定的道理,不是能解决某个问题,就是能改善解决某个问题的效率.如果能够先了解到存在的问题以及已存在的解决办法的不足,那么学习新的知识就更容易接受,也更容易理解. 万幸的是,二叉树的讲解是可以按照上述顺序来进行的.那么,今天在我们讨论二叉树之前,我们先来讨论一种情形.一种操作:假设现在有一个数组,数组中的数据按照某

二分查找-Java版

/** * * 二分查找算法 * * * * @param srcArray 有序数组 * * @param target 查找元素 * * @return srcArray数组下标,没找到返回-1 */ public int binarySearch(int[] srcArray, int target){ int left = 0; int right = srcArray.length - 1; while(left <= right) { int mid = (left + right)

算法(第4版)-1.1.10 二分查找

总结:本小节通过二分查找的例子展示本书学习新算法的基本方法,研究新算法的原理.用例.必要性(模拟实际情况)和性能. 重点: 1.二分查找: import java.util.Arrays; public class BinarySearch { public static int rank(int key, int[] a) { int lo = 0; int hi = a.length - 1; while (lo <= hi) { // 被查找的键要么不存在,要么必然存在于a[lo..hi]