这个题先上代码吧,然后再说一下几个点,折半查找就不作解释了。
参考代码:
#include<stdio.h>
#include<time.h>
int binsearch_b(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 binsearch_a(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;
mid = (low + high) / 2;
}
if(x == v[mid])
return mid;
else
return -1;
}
int main()
{
int x = 5;
int v[] = {1,2,3,4,5,6,7,8,9,10};
int n = 10;
long long i = 10000000;
int loc_a, loc_b;
clock_t start, finish;
double time;
start = clock();
while(i-- > 0)
{
loc_a = binsearch_a(x, v, n);
}
finish = clock();
time = (double)(finish-start) / CLOCKS_PER_SEC;
printf("%d %lf\n", loc_a, time);
i = 10000000;
start = clock();
while(i-- > 0)
{
loc_b = binsearch_b(x, v, n);
}
finish = clock();
time = (double)(finish-start) / CLOCKS_PER_SEC;
printf("%d %lf", loc_b, time);
return 0;
}
binsearch_b是书上给出的折半查找,binsearch_a是答案给出的折半查找。
虽然在重写的函数中,while语句的循环部分只用了一条if语句即可完成。但这要求我们必须在第一次进入while循环之前以及每次循环当中计算出mid的值。而且在while循环结束之后,还需要用一条if语句来判断while循环是否是因为在数组v中找到x而终止的。如果在数组中找到了x,将返回mid变量;否则,返回-1。
在这里,我让两个函数各执行了10000000次来比较他们的运行时间(因为给出的数组是很小的,如果只执行一次,时间基本都是0),结果是两种方案的执行时间差异不大(有兴趣可以自己跑一下看看时间,在这里就不给出了)。因此我们并没有得到很大的性能改进,反而丧失掉了代码可读性,个人感觉得不偿失。