-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexercise3-1.c
More file actions
74 lines (69 loc) · 1.42 KB
/
exercise3-1.c
File metadata and controls
74 lines (69 loc) · 1.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdio.h>
#include <time.h>
#define MAX 2000000
int binsearch(int x, int v[], int n);
int binsearch2(int x, int v[], int n);
int main(){
//build test data
int test[MAX];
int i, index;
clock_t time_bin, time_bin2;
for(i=0; i < MAX; ++i){
test[i] = i;
}
for(i=0,time_bin=clock(); i <= MAX; ++i){
if( i != (index=binsearch(i,test,MAX))){
printf("element missing in binsearch\n");
}
}
time_bin = clock() - time_bin;
for(i=0,time_bin2=clock(); i <= MAX; ++i){
if( i != (index=binsearch2(i,test,MAX))){
printf("element missing in binsearch2\n");
}
}
time_bin2 = clock() - time_bin2;
printf("orig bs: %lu\nbs2: %lu\n",
(unsigned long) time_bin,
(unsigned long) time_bin2
);
}
/*
return index of matching value; if no match return -1
modified to have 1 test inside the loop
*/
int binsearch2(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;
}
return x == v[mid] ? mid : -1;
}
/*
return index of matching value; if no match return -1
from page 58
*/
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{ // match found
return mid;
}
}
return -1; // no match
}