8621 二分查找

8621 二分查找

时间限制:1000MS 代码长度限制:10KB
提交次数:4655 通过次数:1446

题型: 编程题 语言: G++;GCC

Description 编写Search_Bin函数,实现在一个递增有序数组ST中采用折半查找法确定元素位置的算法.

输入格式

第一行:元素个数n
第二行:依次输入n个元素的值(有序)
第三行:输入要查找的关键字key的值

输出格式

输出分两种情形:
1.如果key值存在,则输出其在表中的位置x(表位置从0开始),格式为The element position is x.
2.如果key值不存在输出:“The element is not exist.”

输入样例

6
1 3 5 7 9 10
5

输出样例

The element position is 2.

重点就是  循环条件为 l<=r
还有一个重点!!
下一次二分的时候 r=mid -1或者 l=mid +1 否则死循环
容易把-1 +1漏掉导致超时
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;

//递归二分
void Search_Bin(int* k,int seek,int l,int r,int mid) {
	//如果mid为该值 输出
	if (k[mid] == seek) {
		cout << "The element position is " << mid<<".";
		return;
	}
	//结束条件是  l>r!   l=r的时候需要判断!
	if (l > r) { cout << "The element is not exist."; return; }
	//如果mid大于seek说明  seek在mid左边  
	else if(k[mid]>seek){
		//r为mid-1!! 不是mid  否则会死循环
		r = mid-1;
		//再次找到mid
		mid = l + (r - l) / 2;
		//递归
		Search_Bin(k, seek, l, r, mid);
	}
	//同理
	else if (k[mid] < seek) {
		//这里也是要为mid+1 !!
		l = mid+1;
		mid = l + (r - l) / 2;
		Search_Bin(k, seek, l, r, mid);
	}
}

int main(void) {
	ios::sync_with_stdio(0), cin.tie(0);
	int n;
	cin >> n;
	int* k = new int[n + 1];
	for (int i = 0; i < n; i++) cin >> k[i];
	int seek;
	cin >> seek;
	//Search_Bin(k, seek, 0, n - 1, (n - 1) / 2);

	//非递归二分
	//原理和上面递归差不多
	{
	int l = 0, r = n - 1, mid = (l + r) / 2;
	//结束条件是l<=r!!  需要判定取等情况
	while (l <= r) {
		//如果为mid输出
		if (k[mid] == seek) {
		//这里容易把 . 漏掉
			cout << "The element position is " << mid << ".";
			return 0;
		}
		//如果在mid左边
		else if (k[mid] > seek) {
			//r为 mid-1!!
			r = mid - 1;
			mid = (l + r) / 2;
		}
		//同理
		else if (k[mid] < seek) {
			l = mid + 1;
			mid = (l + r) / 2;
		}
	}
	cout << "The element is not exist.";
	}

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值