一.题目
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.**
`
二..思路分析
二分,通过每一次的mid 来确认 当前数组内元素是不是要找的那个,由于是依序的,所以每一次的操作,都能过滤掉当前长度的一半(不是总长度!),进行多次,把序列都找完,或者是 找到那个元素 ,mid 作为中间位置的值,每次查找完,重调一下lett, 和 right ,重设mid ,进行下一轮查找。
三.代码实现
first :while 实现
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<stack>
#include<cstdlib>
using namespace std;
int a[1000];
int binsearch(int *a,int left,int right,int e)
{
int mid;
while(left <= right) // while 的判断很重要,当 left > right 时,说明已经超出数列了
{
mid = (left + right)/2; //初始mid
if(a[mid] > e)
{
right = mid -1; // 要找的元素小于 当前的中间位置的值,则令区域变成(left,mid-1)
}
else if(a[mid]<e)
{
left = mid +1; // 要找的元素大于 当前的中间位置的值,则令区域变成(mid+1,right)
}
else //找到了
{
return printf("The element position is %d.",mid);
}
}
return printf("The element is not exist.");
}
int main()
{
int n;
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int e;
scanf("%d",&e);
binsearch(a,0,n-1,e);
}
second : 递归实现
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<stack>
#include<cstdlib>
using namespace std;
//int a[10] = {0,1,2,3,4,5,6,78,89,90};
int a[1000];
int bisear(int *a,int left,int right,int e)
{
if(left > right) return printf("The element is not exist."); //边界判断,以此跳出递归
int mid = (left + right )/2; //初始mid
if( a[mid] > e)
{
bisear(a,left,mid-1,e); // 要找的元素小于 当前的中间位置的值,则令区域变成(left,mid-1)
}
else if(a[mid]<e)
{
bisear(a,mid+1,right,e);// 要找的元素大于 当前的中间位置的值,则令区域变成(mid+1,right)
}
else // 找到了
{
return printf("The element position is %d.",mid);
}
}
int main()
{
int n;
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int e;
scanf("%d",&e);
bisear(a,0,n-1,e);
//bisear(a,0,9,100);
return 0;
}
四.总结反思
关于递归,始终还是不太熟练,操作起来也思考了比较久,如果用while 方法来引导,作出递归 就会比较简单一点,不过如果能用while解决的话,递归也就没什么必要了,做一下递归,主要是练习一下自己的思维,毕竟递归还是很常用的。
在C++里面好像是有自带的库函数来实现 二分搜索的,但是还不懂C++,也就不眼高手低了,还有主要还是想锻炼一下自己的打码思维。在已经熟练一些算法之后,以后得去看看C++提供的便利的函数,来简化自己的工作量。