折半查找法是效率较高的一种查找方法。假设有已经按照从小到大的顺序排列好的五个整数a0~a4,要查找的数是X,其基本思想是: 设查找数据的范围下限为l=1,上限为h=5,
求中点m=(l+h)/2,用X与中点元素am比较,若X等于am,即找到,停止查找;否则,若X大于am,替换下限l=m+1,到下半段继续查找;若X小于am,换上限h=m-1,到上半
段继续查找;如此重复前面的过程直到找到或者l>h为止。如果l>h,说明没有此数,打印找不到信息,程序结束。
具体实现的代码如下:
/*************************************************
****************折半查找(二分查找)****************
*************************************************/
#include <iostream>
using namespace std;
void main()
{
int i,j,size;
//指定数组长度
cout<<"要查找的数组长度为:(小于10)";
cin>>size;
if(size>10)
{
cout<<"数组长度错误!"<<endl;
return;
}
float temp,a[10];
//从键盘上为数组赋值
for (i=0;i<size;i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
//使用冒泡排序法对数组按从小到大顺序排序
for (i=0;i<size-1;i++)
{
for (j=i+1;j<size;j++)
{
if (a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
//显示排序结果
cout<<"排序后的数组为:";
for (i=0;i<size;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
//输入要查找的数据
int value;
int flag;
int low,high,mid;
for (i=1;i<=size-1;i++)
{
cout<<"要查找的数值是:";
cin>>value;
//二分法(又叫折半查找法)
flag=0;
low=0;
high=size-1;
while(low<=high)
{
mid=(high+low)/2;
if (a[mid]==value)
{
flag=1;
break;
}
else if (a[mid]<value)
{
low=mid+1;
}
else
{
high=mid-1;
}
}
if (flag)
{
cout<<"数值已找到在:a["<<mid<<"]="<<a[mid]<<endl;
}
else
{
cout<<"数值"<<value<<"没有找到"<<endl;
}
}
}