前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法-二分查找算法(OC、Swift、Python)

算法-二分查找算法(OC、Swift、Python)

原创
作者头像
用户6004386
修改2019-10-18 18:04:15
8440
修改2019-10-18 18:04:15
举报
文章被收录于专栏:iOS代码混淆
p.jpeg
p.jpeg

前言

二分查找在程序开发过程中是十分常见的算法,也是在程序员面试过程中关于算法的知识点考察过程中最常问的知识点;二分查找在实际开发过程中也常常用的到;就比如在一个一维有序数组中查找最大的一个数;我们可以每次都和数组中间的元素对比,然后缩小查找范围。

二分查找是一个非常快速高效的查找算法,因为每次查找数据查找空间都会被缩小为原理数组长度的一半,直到查找空间为空,才结束查找。

但是二分查找针对的是有序数组,而且是那种不经常变动数组;还有就是要是数据的数据量比较小,也不是适合用二分查找,毕竟遍历一次就够了,相对于去处理数据量比较大的数组时,二分查找的优势就比较明显了!

代码

这里我放上OC、Swift和Python的二分查找的代码,以便大家学习交流。

OC
代码语言:txt
复制
- (NSInteger)halveSearch:(NSArray *)array target:(id)target{
    if(array.count == 0){
        return -1;
    }
    //标记区间的开始小标
    NSInteger start = 0;
    //标记区间结束的下标
    NSInteger end = array.count - 1;
    //标记区间中间的下标
    NSInteger middle = 0;
    
    while (start < end - 1) {
        //取区间数组里面的中间下标
        middle = start + (end - start) / 2;
        
        //中间值大于目标值
        if([array[middle] integerValue] > [target integerValue]){
            //目标值在中间值前面,将中间值赋给end作为最后一个值,在前面进行搜索取值
            end = middle;
        }else{
            //中间值小于目标值
            //将中间值赋给start作为开始值,在后面一段进行搜索
            start =  middle;
        }
        
        //如果起始值等于目标值
        if ([array[start] integerValue] == [target integerValue]) {
            return start;
        }
        
        //如果结束值等于目标值
        if ([array[end] integerValue] == [target integerValue]) {
            return end;
        }
    }
    
    return -1;
}

Swift

代码语言:txt
复制
func halveSearch(_ array: Array<Any>, target: NSInteger) -> NSInteger {
        if array.count == 0{
            return -1
        }
        //标记区间的开始小标
        var start = 0
        //标记区间结束的下标
        var end = array.count - 1
        //标记区间中间的下标
        var middle = 0
        
        while start < end - 1 {
            //取区间数组里面的中间下标
            middle = start + (end - start) / 2
            
            //中间值大于目标值
            if (array[middle] as AnyObject).integerValue > target{
                //目标值在中间值前面,将中间值赋给end作为最后一个值,在前面进行搜索取值
                end = middle
            }else{
                //中间值小于目标值
                //将中间值赋给start作为开始值,在后面一段进行搜索
                start =  middle
            }
            
            //如果起始值等于目标值
            if (array[start] as AnyObject).integerValue == target{
                return start
            }
            
            //如果结束值等于目标值
            if (array[end] as AnyObject).integerValue == target{
                return end
            }
        }
        
        return -1
    }

Python

代码语言:txt
复制
def halveSearch(array, target):
	if len(array) == 0:
		return -1

	# 标记区间的开始小标
	start = 0
	# 标记区间结束的下标
	end = len(array) - 1
	# 标记区间中间的下标
	middle = 0

	while start < end - 1:
		# 取区间数组里面的中间下标
		middle = int(start + (end - start) / 2)

		# 中间值大于目标值
		if array[middle] > target:
			# 目标值在中间值前面,将中间值赋给end作为最后一个值,在前面进行搜索取值
			end = middle
		else:
			# 中间值小于目标值
            # 将中间值赋给start作为开始值,在后面一段进行搜索
			start =  middle

		# 如果起始值等于目标值
		if array[start] == target:
			return start

		# 如果结束值等于目标值
		if array[end] == target:
			return end

	return -1

结束语

欢迎各位大神提出宝贵的意见和建议,也欢迎大家进群交流365152048!

CSDN博客

https://zfj1128.blog.csdn.net

GITEE主页

https://gitee.com/zfj1128

GITHUB主页

https://github.com/zfjsyqk

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 代码
    • OC
      • Swift
        • Python
        • 结束语
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档