折半查找

试题描述
大魔导师培根曾经说过:“读书使人明智,读书使人聪慧,演算使人精密,哲理使人深刻,伦理学使人有修养,逻辑修辞使人善辩。”由此可见书籍的重要性是不可言喻的。而与书籍天天打交道的书籍管理员,更是夺天地之造化,吸日月之精华的“神之职业”。据史料记载,魔法世界从古至今诞生众多的不平凡的人物中,有不少人曾经做过“图书管理员”,如道家学派创始人老子,微软公司创始人比尔,少林藏经阁的扫地神僧等等。所以,作为以马虎自负出名的楚继光,在魔法学院的社会实践活动中又怎么会放过这“天将降大任于斯人也”的必经锻炼呢。但想成为一个合格的图书管理员并不容易,他必须能够在一排(10000以内)已按编号从小到大排好序的图书中,快速的按照编号,查找到某本书所在的位置。
输入
第一行包含一个正整数 N ,表示有 N 个书的编号,第二行是 N 个正整数(表示书的编号),两数之间用一个空格分隔,第三行包含一个正整数 M 表示要查找的书的编号。
输出
如果能找到就输出两个数,第一个数表示 M 的位置(位置从1开始),第二个数表示用折半查找法查找的过程中比较的次数,两数之间用一个空格分隔。如果不能找到 M 则输出 -1.
输入示例
3 2 4 6 4
输出示例
2 1
其他说明
所有输入的数都不超过 10000 。

 

#include <iostream>
using namespace std;
int main()
{
    int head,tail,mid,n,m,a[10010],ans=1,f=0;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    cin>>m;
    head=1;
    tail=n;
    for(int i=1;i<=n;i++)
    {
        mid=(head+tail)/2;
        if(a[mid]==m)  
        {
            cout<<mid<<" ";
            f=1;
            break;
        }
        else
        {
            if(a[mid]<m)
                head=mid;
            if(a[mid]>m)
                tail=mid;
            ans++;
        }
    }
    if(f==1)
        cout<<ans;
    else
        cout<<"-1";
}
    
View Code

 

posted @ 2017-03-18 15:44  Dijkstra·Liu  阅读(247)  评论(0编辑  收藏  举报