您的位置:首页 > 其它

The C Programming Language 练习题3-1

2017-10-08 20:00 363 查看
题目

在上面有关折半查找的例子中,while循环语句内共执行了两次测试,其实只要一次就足够(代价是将更多的测试在循环外执行)。重写该函数,使得在循环内部只执行一次测试。比较两种版本函数的运行时间。

题目分析

想半天没想明白,后来找到了作者答案,一起贴上来吧。

代码实现

#include <stdio.h>

int binsearchtemp(int x, int v[], int n)
{
int low, high, mid;

low = 0;
high = n - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (x < v[mid])
high = mid + 1;
else if ( x > v[mid])
low = mid + 1;
else
return mid;
}
return -1;
}

int binsearchtemp2(int x, int v[], int n)
{
int low, high, mid;

low = 0;
high = n - 1;
mid = (low + high) / 2;
while (low <= high && x != v[mid])
{
if (x < v[mid])
high = mid + 1;
else
low = mid + 1;
}
if (x == v[mid])
return mid;
else
return -1;
}

int main()
{
int numbertest[10] = {3, 5, 9 , 11, 18, 19, 34, 56, 78, 99};
printf("position:%d\n", binsearchtemp(18, numbertest, 10));
printf("position:%d\n", binsearchtemp2(18, numbertest, 10));
}


结论[/b]

测试了一下,原来的算法耗时0.207秒,新的算法耗时0.187秒。

个人理解原理是由于循环中少了一行语句,所以执行时间减少了。比如原来要做5次循环,每次循环3个语句,要执行3*5=15次,而现在是2个语句,所以执行2*5=10次,所以效率提升了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: