1010: 折半查找的实现
题目描述
编写程序实现折半查找算法。
输入
第一行是查找表的长度n
第二行是查找表中的数据元素 ;
第三行是要查找的数据元素的关键字.
输出
查找成功返回位序,不成功返回-1 ,第二行为比较的次数。
样例输入
11
5 13 19 21 37 56 64 75 80 88 92
100
样例输出
-1
4
思路:折半查找(二分查找)
首先,假设表中元素是按升序排列,
然后,将表中间位置记录的关键字与查找关键字比较,
①如果两者相等,则查找成功;
②如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,
③如果中间位置记录的关键字小于查找关键字,则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功;或直到子表不存在为止,此时查找不成功。
折半查找除了用循环还可以用递归,五一放假我就偷偷懒用循环啦
#include<bits/stdc++.h>
using namespace std;
int a[1000];//定义全局变量就很妙
void find(int left, int data, int right)
{
int mid, temp=0;
while(left<=right)//重复此过程直到左<=右
{
mid=(left+right)/2;
temp++;
if(a[mid]==data)//数据在中间
{
cout << mid <<"\n" <<temp;
//很奇妙的是数据结构的题似乎最后一行数据都不要\n,
//也不难理解,数据结构的题重在思路而轻在技巧
//类似于print("%d\n%d" , mid, temp);
return ;
}
else if(a[mid]>data)//数据在前子表
{
right=mid-1;
} else if(a[mid]<data)//数据在后子表
{
left=mid+1;
}
}
cout <<"-1" <<"\n" <<temp;
//类似于print("-1\n%d" , temp);
}
int main()
{
int n, data;
cin >> n;
//类似于scanf("%d", &n);
for(int i=0;i<n;i++)
{
cin >>a[i];
//类似于scanf("%d", &a[i]);
}
cin >> data;
//类似于scanf("%d", &data);
find(0,data,n-1);
}
return 0;
以上方法仅供参考,欢迎互联网的广大朋友们提出指正。