1.0二分查找算法Objective - C和swift

/*

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

二分查找优点:

1.速度快   2.比较次数少    3.性能好

当然了,

缺点也很明显:

1.必须是一个有序的数组(升序或者降序)

2.适用范围:适用不经常变动的数组

*/

Objective-C代码:

NSArray *arr = @[@(3),@(7),@(9),@(14),@(25),@(26),@(37),@(69)];

 NSLog(@"二分查找:%lu",[self binarySearch:arr target:37]);

target是目标值,即要找的值。

- (NSInteger)binarySearch:(NSArray *)array target:(NSInteger)target {
    if (!array.count) {
        return -1;//数组无元素,返回-1;
    }
    //数组起始元素下标
    NSInteger start = 0,end = array.count - 1;//数组最后元素的下标
    NSInteger mid = 0;
    //就剩两个数的时候  start = end - 1;这个条件跳出
    while (start < end - 1) {
        //会有一些朋友看到有些人是( start + end ) / 2这样写的,但是这样写有一点不好,就是low+high会出现整数溢出的情况,如果存在溢出,你再除以2也是没有用的,所以不能这么写
        mid = start + ((end - start)/2);
        
        //第mid项的内容
        NSInteger curNum = [array[mid] integerValue];
        if (curNum > target) {
            end = mid;
        } else {
            start = mid;
        }
    }
    if (target == [array[start] integerValue]) {
        return start;
    }
    if (target == [array[end] integerValue]) {
        return end;
    }
    
    return -1;
}

swift代码:

let arr = [1,5,11,23,45,55,60,76,88,100];

print(self.binarySearch(array: arr, target: 100))

func binarySearch(array:[Int],target:Int) -> Int {
        if array.isEmpty {
            return -1
        }
        var start = 0
        var end = array.count - 1
        var mid = 0;
        while start < end - 1 {
            mid = start + ((end - start)/2);
            if target < array[mid] {
                end = mid
            } else {
                start = mid
            }
        }
        if (target == array[start]) {
            return start
        }
        if (target == array[end]) {
            return end
        }
        return -1
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值