else-if语句的最后一个else部分用于处理“上述条件均不成立”的情况或默认情况,也就是当上面各条件都不满足时的情形。
在折半查找时,首先将输入值x与数组v的中间元素进行比较。如果x小于中间元素的值,则在该数组的前半部分查找;否则,在该数组的后半部分查找。在这两种情况下,下一步都是将x与所选部分的中间元素进行比较,这个过程一直进行下去,直到找到指定的值或查找范围为空。
/* binsearch函数:在v[0]<=v[1]<=v[2]<= <=v[n-1]中查找x */
int binsearch(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; /* 没有匹配的值 */
}
该函数的基本判定是:在每一步判断x小于、大于还是等于中间元素v[mid]。使用else-if结构执行这种判定很自然。
练习3-1
#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;
}