天梯赛训练:平均查找长度之二分查找

题意:

编程统计,长度为N的有序数组进行二分查找时,查找成功与失败的平均查找长度。注意,表达成总查找长度除以总查找个数的形式。

输入样例:

输入数组的元素个数:一个正整数:

6

输出样例:

在第一行输出查找成功的平均查找长度,在第二行输出查找失败的平均查找长度: (不要求计算,也不进行约分,仅输出成分数形式)

14/6
27/7

题解:首先画出一个具有n个节点的二叉树。

查找成功的平均查找长度为:二叉树每一层的节点数乘以层数,然后累加,最后除以元素个数n。

查找失败的平均查找长度为:把每一个节点的叶子节点补齐,然后计算叶子节点的个数乘以所在的层数,然后累加,最后除以元素个数n加一。

例如:

天梯赛训练:平均查找长度之二分查找_第1张图片

我是利用二叉树的性质写的:具体性质可参考这篇博客

代码:

#include
#include
#include
#include
#include
#include
using namespace std;
int high(int n)
{
	int s=0;
	while(n)
	{
		n=n/2;
		s++;
	}
	return s;
}
int main()
{
	int n;
	scanf("%d",&n);
	int h=high(n);
	int i,j,k;
	int cg=0;
	for(i=1; i<h; i++)
		cg+=(i*pow(2,i-1));
	int ss=0;
	for(i=pow(2,h-1); i<=n; i++)
		ss++;
	cg+=(ss*h);
	printf("%d/%d\n",cg,n);
	int kk=ss*2*(h+1);
	int mm=pow(2,h-1)-ss;
	kk+=(mm*h);
	printf("%d/%d\n",kk,n+1);
	return 0;
}

你可能感兴趣的:(蓝桥杯和天梯赛,算法)