蓝桥杯 ALGO-379 二分法查找数组元素 | 刷题打卡

256 阅读1分钟

本文正在参与掘金团队号上线活动,点击查看大厂春招职位

一、题目描述

问题描述

  用递归函数实现二分法查找数组元素。
补充:要求给定数组采用如下代码定义
int data[200];
for (i=0; i<200; i++)
data[i]=4*i+6;

输入格式

  输入一个待查找的整数(该整数一定在数组data中)。

输出格式

  该整数在数组中的指标。

样例输入

一个满足题目要求的输入范例。
例1: 262
例2: 438
例3: 774

样例输出

与上面的样例输入对应的输出。
例1:64
例2: 108
例3: 192

数据规模和约定

  输入数据中每一个数的范围。   输入数据必须满足4*i+6,i=0,1,2,3,...,198,199。

资源限制

时间限制:1.0s 内存限制:256.0MB

二、思路分析

本来我不会二分查找,于是就直接根据数据特征输入输出了,如法一
后来花了半小时学了下二分查找,用二分法写了后面两个代码,第一次在程序中实现二分查找,牛刀小试😁
二分查找思想需要在有序数列里实现,首先拿一个元素和数列中间元素比较,如果比中间大,则再与后半部分中间的数比较,反之则与前半部分中间的数比较,总之就是不断和中间数据比较,直到相等为止

三、AC代码

法一:直接解法

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	cout<<(n-6)/4;
	return 0; 
}

法二: 二分查找

#include<bits/stdc++.h>
using namespace std;
int Binsearch(int data[],int low,int high,int key)
{
	while(low<=high)
	{
		int mid=(low+high)/2;
		if(data[mid]==key) return mid;
		else if(data[mid]>key)
				high=mid-1;
			 else low=mid+1;
	}
}
int main()
{
	int data[200],n;
	for(int i=0;i<200;i++)
	data[i]=4*i+6;
	cin>>n;
	cout<<Binsearch(data,0,199,n);
	return 0;
}

法三: 二分查找递归版

#include<bits/stdc++.h>
using namespace std;
int Binsearch(int *data,int low,int high,int key)
{
	if(low<=high)
	{
		int mid=(low+high)/2;
		if(data[mid]==key) return mid;
		else if(data[mid]>key)
				return Binsearch(data,low,mid-1,key);
			 else return Binsearch(data,mid+1,high,key);
	}
}
int main()
{
	int data[200],n;
	for(int i=0;i<200;i++)
	data[i]=4*i+6;
	cin>>n;
	cout<<Binsearch(data,0,199,n);
	return 0;
}

四、总结

二分查找是种简单的算法,但是想要完全精通二分查找还是不简单的
坚持学习,每天离算法大神近一点😃