6-1 exercise 3-1 BinarySearch (10分)
Our binary search(see page 58, section 3.3) makes two tests inside the loop, when one would suffice (at the price of more tests outside.) Write a version with only one test inside the loop and measure the difference in run-time.
函数接口定义:
int binsearch_naive(int x, int v[ ], int n);
find x in v[0] <= v[1] <= ... <= v[n-1]. If x is in the array v, return the index, else return -1.
裁判测试程序样例:
#include <stdio.h>
int binsearch_naive(int x, int v[ ], int n);
int compare (const void * a, const void * b);
int main ()
{
int n; //数组大小
int m; //询问的数量
scanf("%d", &n);
int * v = (int*)malloc(sizeof(int) * n);
for(int i = 0; i < n; i++) {
scanf("%d", &v[i]);
}
qsort(v, n, sizeof(int), compare); //排序
scanf("%d", &m);
while(m--) {
int x;
scanf("%d", &x);
printf("%d\n", binsearch_naive(x, v, n));
}
free(v);
return 0;
}
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
/* 请在这里填写答案 */
输入样例:
5
3 2 1 5 4
3
6 3 2
输出样例:
-1
2
1
第一种方法
int binsearch_naive(int x, int v[ ], int n)
{
int min,max,mid;
min=0;
max=n-1;
while(min<=max){
mid=(min+max)/2;
if(x>v[mid])
min=mid+1;
else if(x<v[mid])
max=mid-1;
else
return mid;
}
return -1;
}
优化后:
int binsearch_naive(int x, int v[ ], int n)
{
int min,mid,max;
min=0;
max=n-1;
mid=(max+min)/2;
while(min<=max&&x!=v[mid])
{
if(x>v[mid])
min=mid+1;
else
max=mid-1;
mid=(max+min)/2;
}
return(x==v[mid])?mid:-1;
}