SWUST OJ 1010: 折半查找的实现

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

以上方法仅供参考,欢迎互联网的广大朋友们提出指正。

  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值