二分查找算法,折半查找算法(10分)
题目内容:
采用二分查找法查找特定关键字的元素。要求用户输入数组长度(该长度不会超过100),也就是有序表的数据长度,并输入有序数组元素和査找的关键字。程序输出查找成功与否,以及成功时关键字在数组中的位置。例如,在有序表 11、13、18、 28、39、56、69、89、98、122 中査找关键字为 89 的元素。
输入格式:
输入数组长度
输入有序数据
输入要查找的数据
输出格式:
如果找到输出“查找成功!”,然后换行输出查找成功所需的查找次数,再换行输出查找的下标和数据
如果没有找到输出“ 查找失败!”
输入样例:
10
11 13 18 28 39 56 69 89 98 122
89
输出样例:
查找成功!
查找次数为2a[7]=89
代码如下:
这题一定要理解折半查找思想——不是对半分区间后,穷举循环,那是爆算并没有简化计算量
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int length,goal,i,middle,front=0,behind,flag=0,counter=0;
cin>>length;
behind=length-1;
int data[length];
for(i=0;i<length;i++)
{
cin>>data[i];
}
cin>>goal;
while(1)
{
counter++;
middle=(front+behind)/2;//寻找中间下标
if(goal==data[middle])
{
flag=1;
cout<<"查找成功!"<<endl;
break;
}
else if(goal>data[middle])//目标在右区间
{
front=middle+1;//右区间包括middle在内都不要
}
else if(goal<data[middle])//目标在左区间
{
behind=middle-1;//左区间包括middle在内都不要
}
if(front>=behind)break;
}
if(flag)
{
cout<<"查找次数为"<<counter<<"\na["<<(front+behind)/2<<"]="<<data[middle]<<endl;
}
else cout<<"查找失败!"<<endl;
return 0;
}