面试题之二分法查找详解_二分法面试题(1),python毕业设计代码量

二分法 查找的思路 如下:
1.首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。
2、如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。
3. 如果某一步数组为空,则表示找不到目标元素。

二分法查找的时间复杂度O(logn)。

举例加深概念

文字说明一下二分法究竟是怎样的: 给定的数组是有序的,给定一个key值,每次查找最中间的值,如果相等,就返回对应的下标;如果key 大于 最中间的值,则在数组的 右半边 继续查找;如果 小于,则在数组的 左半边 查找。那么最终存在两种结果:一种是找到了并返回对应的下标,第二种就是没有找到,返回-1。

举例说明:

存在一个数组arr[10],假设arr[10]={3,6,7,9,15,20,26,33,56,63},定义两个边界的下标low和high,以及中间下标mid, 记住,数组前提一定是排序好了的,排序方法可见我后面博文会涉及到

int low=0;
int high=10-1;
int mid=(low+high)/2;

在对每一步进行比较的时候,low<=high,如果要找key为56的值对应的下标,那么第一次我们先找到中间下标mid=4。因为arr[4]=15,比当前的key值要小,则按照要求在数组的右半部分查找,让low=mid+1,high值不变。接下来,我们继续找到右半部分的中间下标 mid = (5+9)/2=7arr[7]=33,比当前的key值还小,那么继续向右半边查找,且 low=mid+1,high值继续不变。接下来,找到中间下标mid=(8+9)/2=8。这个时候arr[8]key56,OK,找到目标值,停止查找,返回下标mid。

通过上面例子可以看出,在进行指定key查找的次数总共3次,通过根据中间值和目标key进行比较来判定目标key的位置。接下来给出相关处理代码:

非递归算法:
C实现写法:
int binarySearch(int arr[], int arrSize, int key)
{
    int low=0; //数组最小索引值

    int high=arrSize -1; //数组最大索引值
    while(low<=high){
        int mid=  floor((low+high)/2);
        if(key==arr[mid]){
            return mid;
        }else if(key>arr[mid]){
            low=mid+1;
        }else{
            high=mid-1;
        }
    }
    return -1; //low>high的情况,这种情况下key的值大于arr中最大的元素值或者key的值小于arr中最小的元素值
}


Main调用如下

int arr[10]={3,6,7,9,15,20,26,33,56,63};
for(auto arrayValue:arr){
    qInfo()<<"Array = "<<arrayValue;
}
QTime time;
time.start();
int key = binarySearch(arr, 10, 56);
qInfo()<<"find key = "<<key;
qInfo()<<"花费时间 :"<<time.elapsed()/1000.0<<"秒";

结果测试:

Array =  3
Array =  6
Array =  7
Array =  9
Array =  15
Array =  20
Array =  26
Array =  33
Array =  56
Array =  63
find key =  8
花费时间 : 0 秒

js 实现写法:
function binarySearch(arr,key){
	var low=0; //数组最小索引值
	var high=arr.length-1; //数组最大索引值
	while(low<=high){
		var mid=Math.floor((low+high)/2);
		if(key==arr[mid]){
			return mid;
		}else if(key>arr[mid]){
			low=mid+1;
		}else{
			high=mid-1;
		}
	}
	return -1; //low>high的情况,这种情况下key的值大于arr中最大的元素值或者key的值小于arr中最小的元素值
}

递归算法:
C类语言实现
int binarySearch(int arr[], int low, int high,int  key){
    if(low>high)
    {
        return -1;
    }
    int mid= floor((low+high)/2);

    if(key==arr[mid]){
        return mid;
    }else if(key<arr[mid]){
        high=mid-1;
        return binarySearch(arr,low,high,key);
    }else{
        low=mid+1;
        return binarySearch(arr,low,high,key);
    }
}


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数同学面临毕业设计项目选题时,很多人都会感到无从下手,尤其是对于计算机专业的学生来说,选择一个合适的题目尤为重要。因为毕业设计不仅是我们在大学四年学习的一个总结,更是展示自己能力的重要机会。

因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
img
img
img

既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!

由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频

如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
img

序、Python等项目供你选择,真正体系化!**

由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频

如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
[外链图片转存中…(img-8DlSV7BM-1712592434571)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值