折半查找法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了折半查找法相关的知识,希望对你有一定的参考价值。
题目描述:
大魔导师培根曾经说过:“读书使人明智,读书使人聪慧,演算使人精密,哲理使人深刻,伦理学使人有修养,逻辑修辞使人善辩。”由此可见书籍的重要性是不可言喻的。而与书籍天天打交道的书籍管理员,更是夺天地之造化,吸日月之精华的“神之职业”。据史料记载,魔法世界从古至今诞生众多的不平凡的人物中,有不少人曾经做过“图书管理员”,如道家学派创始人老子,微软公司创始人比尔,少林藏经阁的扫地神僧等等。所以,作为以马虎自负出名的楚继光,在魔法学院的社会实践活动中又怎么会放过这“天将降大任于斯人也”的必经锻炼呢。但想成为一个合格的图书管理员并不容易,他必须能够在一排(10000以内)已按编号从小到大排好序的图书中,快速的按照编号,查找到某本书所在的位置。
输入格式:
第一行包含一个正整数 N ,表示有 N 个书的编号,第二行是 N 个正整数(表示书的编号),两数之间用一个空格分隔,第三行包含一个正整数 M 表示要查找的书的编号。
输出格式:
如果能找到就输出两个数,第一个数表示 M 的位置(位置从1开始),第二个数表示用折半查找法查找的过程中比较的次数,两数之间用一个空格分隔。如果不能找到 M 则输出 -1.
输入样例:
3
2 4 6
4
输出样例:
2 1
代码如下:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if( ch == ‘-‘ ) f=-1; for(;isdigit(ch);ch=getchar()) x=x*10+ch-‘0‘; return x*f; } const int maxn = 10001; int n , m, a[maxn] ,mark; void ef(int l , int r){ if( l > r ){ puts("-1"); return ; } mark ++; int mid = (l + r) / 2; if(a[mid] == m ){ printf("%d %d\n",mid ,mark); } else if( a[mid] > m ){ ef(l,mid-1); } else ef(mid+1,r); return ; } int main(){ n = read(); for(int i = 1 ; i <= n ; i ++){ a[i] = read(); } m = read(); ef(1,n); }
以上是关于折半查找法的主要内容,如果未能解决你的问题,请参考以下文章