何谓折半查找,举个例子很快就可以明白,给你了9个数 1 2 3 4 5 6 7 8 9 让你去找2在哪里,这时候你肯定会说这太简单了,但是计算机就没那么强了,它得拿着2和这9个数一个一个的比较,2在前面还好比较的次数比较小,但是如果让你找6在哪呢,需要比较的次数就多了,可能你觉得多这一次两次没什么差别,但是如果1到10000个数让你找呢,这时候折半查找的优势就显现出来了。我们先看2在不在1-5里面也就是前半段,如果在前半段,我们直接不和后边的数进行比较,我们确定2在1到5里面之后,我们再用类似的办法再去掉一半,看2在不在1到3面里,如果不在我们去3到5里找,如此下去直到找到为止,我们会发现计算机最擅长干的事就是迭代,而优秀的算法就是让计算机迭代的次数少一点。c++用代码实现如下
#include<iostream>
using namespace std;
int main()
{
const int n=10;
int i,number,top,bott,mid,loca,a[n];//mid用bott和top表示,方便迭代。
bool flag=true,sign;//设置布尔变量即标志位。
char c;
cout<<"enter data:"<<endl;
cin>>a[0];
i=1;
while(i<n)
{
cin>>a[i];
if(a[i]>=a[i-1])
i++;
else
cout<<"enter this data again:";//输入已经排好序的数列,也可以加上冒泡排序自动排序
}
cout<<endl;
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
while(flag)
{
cout<<"input number of to look for:";
cin>>number;
sign=false;
top=0;
bott=n-1;
if((number<a[0])||(number>a[n-1]))
loca=-1;
while((!sign)&&(top<=bott))
{
mid=(bott+top)/2;
if(number==a[mid])
{
loca=mid;
cout<<"find"<<number<<",its position is"<<loca+1<<endl;
sign=true;
}
else if(number<a[mid])
bott=mid-1;//舍去后一半
else
top=mid+1;
}
if(!sign||loca==-1)
cout<<number<<"has not found"<<endl;
cout<<"continue or not";
cin>>c;
if(c=='n'||c=='N')
flag=false;
}
return 0;
}
输入十个已经排好序的数,然后进行查找。