二分查找

本文探讨了二分查找的两种实现方式——非递归和递归,并着重分析了在不同情况下查找(比较)次数。以数组a[31]为例,当查找次数为5次时,能成功查找的最大元素数量为31,最小为16,揭示了二分查找效率的规律。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

非递归实现

//二分查找非递归版本
#include<iostream>
#include<vector>
int binarySearch(std::vector<int> data, int k){
	int low = 0;
	int high = data.size() - 1;
	while(low <= high){  //必须加等号,否则此例中5将找不到
		int mid = (low + high) / 2;
		if(data[mid] == k)
			return mid;
		else if(data[mid] > k)
			high = mid - 1;
		else
			low = mid + 1;
	}

	//std::cout<<"not found"<<std::endl;
	//return 0;
	return -1;  //没有找到,上面注释掉的方法也可以
}

int main(){
	std::vector<int> v{2, 3, 5};
	int ret = binarySearch(v, 5);
    std::cout<<ret;
	return 0;
}

递归实现

//二分查找递归版本
#include<iostream>
#include<vector>
int binarySearch(std::vector<int>& data, int k, int low, int high){
    int ret = 0;
	if(low <= high){
		int mid = (low + high) / 2;
		if(data[mid] == k){
            ret = mid;
            //return ret;
		}
		else if(data[mid] > k)
            ret = binarySearch(data, k, low, mid - 1);
		else
			ret = binarySearch(data, k, low + 1, high);
	}
	if(low > high){
        //std::cout<<"not found"<<std::endl;
        //return 0;
        return -1;  //没有找到
	}
	else
        return ret;
}
int main(){
	std::vector<int> v{2, 3, 5};
	int ret = binarySearch(v, 2, 0, 2);
    std::cout<<ret;
	return 0;
}


查找(比较)次数

假设数组a[31],存1-31的数,
二分查找的次数为logN,N是2的幂次方时,查找次数为logN+1。最多查找5次的话,那么N最大可以是31,最小可以是16,最多有31个数。规律应该是这样。
31个数经过5次查找成功的节点数为25−1^{5-1}51=16
30个数经过5次查找成功的节点数为25−1^{5-1}51-1=15
29个数经过5次查找成功的节点数为25−1^{5-1}51-2=14

16个数经过5次查找成功的节点数为25−1^{5-1}51-15=1
15个数经过5次查找成功的节点数为25−1^{5-1}51-16=0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值