折半查找
试题描述
|
大魔导师培根曾经说过:“读书使人明智,读书使人聪慧,演算使人精密,哲理使人深刻,伦理学使人有修养,逻辑修辞使人善辩。”由此可见书籍的重要性是不可言喻的。而与书籍天天打交道的书籍管理员,更是夺天地之造化,吸日月之精华的“神之职业”。据史料记载,魔法世界从古至今诞生众多的不平凡的人物中,有不少人曾经做过“图书管理员”,如道家学派创始人老子,微软公司创始人比尔,少林藏经阁的扫地神僧等等。所以,作为以马虎自负出名的楚继光,在魔法学院的社会实践活动中又怎么会放过这“天将降大任于斯人也”的必经锻炼呢。但想成为一个合格的图书管理员并不容易,他必须能够在一排(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"; }