exc/k&r/03-control-flow/03-01.c

70 lines
1.5 KiB
C
Raw Normal View History

2023-06-23 16:59:45 +02:00
#include <stdio.h>
#define SIZE 1000000
#define X 2*((SIZE-1) / 2) + 1
#define T 10000000
int binsearch(int x, int v[], int n);
int binsearch_old(int x, int v[], int n);
/* run binsearch on array of size SIZE
* if arg is provided use old binsearch */
int main(int argc, char *argv[])
{
long i;
int arr[SIZE];
for (i = 0; i < SIZE; ++i)
arr[i] = 2 * i;
if (argc == 1) {
for (i = 0; i < T; ++i)
binsearch(X, arr, SIZE);
printf("binsearch : %d\n", binsearch(X, arr, SIZE));
}
else {
for (i = 0; i < T; ++i)
binsearch_old(X, arr, SIZE);
printf("old binsearch : %d\n", binsearch_old(X, arr, SIZE));
}
return 0;
}
/* binsearch: find x in sorted v of length n, using one comparison in loop */
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;
else
low = mid + 1;
}
if (v[low] == x)
return low;
return -1;
}
/* binsearch: find x in sorted v of length n, using two comparisons in loop */
int binsearch_old(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;
}