编程实现折半法查找

折半查找法是效率较高的一种查找方法。假设有已经按照从小到大的顺序排列好的五个整数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;
        }
    }
}


原文地址:https://www.cnblogs.com/raiven2008/p/4260878.html