C++算法之二分查找

一、算法思想

升序排列的n个元素集合A分成个数大致相同的两部分,取A[n/2]与想要查找的find值作比较,如果相等则表示找到find值,算法终止。如果find<A[n/2]则表示find值在数组A的前半部分,将设置的upper值设为mid-1之后继续查找。如果find>A[n/2]则表示find值在数组A的后半部分,将设置的low值设为mid+1之后继续查找。最终函数返回find值或者-1。

二、算法步骤

在实现二分查找的BinarySearch函数中,其实现原理为:

  1. 首先设置low、upper、mid等值,low表示左半边的部分,upper表示右半边的部分,mid表示中间值。
  2. 其次使用一个while循环来进行查找find值,条件为low要小于upper。
  3. 循环函数里面首先将mid值求出来,最好别用两数相加除以2,那样可能会造成溢出,我所用的是low+(upper-low)/2。其次写两个判断函数来判断find值是在左半边还是右半边,之后写个else语句,如果前面两个判断函数都没有调用,则有可能mid值就是find值。
  4. 在循环函数外面直接返回-1,因为当循环函数循环完都没有返回则说明在数组中根本没有find值。

三、实现代码

#include<iostream>
#include<ctime>

#define N  10
using namespace std;

int BinarySearch(int A[], int n, int find) {
	int low, upper, mid;
	low = 0;
	upper = n - 1;
	while (low < upper) {
		//求中间位置,最好不直接两数相加除以2,那样可能会造成溢出
		mid = low + (upper - low) / 2;
		if (A[mid] < find) {	//想要查找的数比中间值大,说明在右半部分
			low = mid + 1;
		}
		else if (A[mid] > find) {	//想要查找的数比中间值小,说明在左半部分
			upper = mid - 1;
		}
		//前面条件都不满足,则中间值就是我们找的值,直接返回值就行
		else
			return mid;

	}
	//循环条件没有返回,则说明在数组中没有find这个值
	return -1;
}
int main() {
	int A[N];
	//设置随机数种子
	srand((unsigned int)time(0));

	for (int i = 0; i < N; ++i) {
		A[i] = rand() % 50;
		cout << A[i] << " ";
	}
	cout << endl;

	int B[N]{ 12,4234,23,24,124,124,123,42143,124,214 };
	cout << BinarySearch(A, N, 9) << endl;
	cout << BinarySearch(B, N, 124) << endl;
	for (int i = 0; i < N; ++i) {
		cout << A[i] << " ";
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值