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;
}