diff options
| author | Sadeep Madurange <smadurange@users.noreply.github.com> | 2021-12-01 23:51:00 +0800 |
|---|---|---|
| committer | Sadeep Madurange <smadurange@users.noreply.github.com> | 2021-12-01 23:51:00 +0800 |
| commit | a1c867d3eb55dc5ead5b8e2c069746b9785bb7b3 (patch) | |
| tree | b1e13e1f5d4f34a0d1d06ee83daf2f241c0a99fd | |
| parent | ec38e6e0c38d3653b80701d5fc0df2ce92e59742 (diff) | |
| download | k&r-exercises-a1c867d3eb55dc5ead5b8e2c069746b9785bb7b3.tar.gz | |
3.1
| -rw-r--r-- | 3/1.c | 72 |
1 files changed, 72 insertions, 0 deletions
@@ -0,0 +1,72 @@ +#include <stdio.h> +#include <time.h> + +int binsearch1(int x, int v[], int n); +int binsearch2(int x, int v[], int n); + +/* measures time taken for two implementations of binsearch */ +int main(int argc, char *argv[]) { + int i, x, n, iter, i1, i2; + long t1, t2; + struct timespec fs, ts; + + x = 7; + n = 10; + iter = 10000000; + int v[] = { 0, 1, 2, 5, 6, 7, 9, 10, 11, 13 }; + + clock_gettime(CLOCK_REALTIME, &fs); + for (i = 0; i < iter; i++) + i1 = binsearch1(x, v, n); + clock_gettime(CLOCK_REALTIME, &ts); + + t1 = ts.tv_nsec - fs.tv_nsec; + printf("1: found %d in %f sec\n", i1, (double) t1 / 1e9); + + clock_gettime(CLOCK_REALTIME, &fs); + for (i = 0; i < iter; i++) + i2 = binsearch2(x, v, n); + clock_gettime(CLOCK_REALTIME, &ts); + + t2 = ts.tv_nsec - fs.tv_nsec; + printf("2: found %d in %f sec\n", i2, (double) t2 / 1e9); + + return 0; +} + +int binsearch1(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 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]) { + mid = (low + high) / 2; + if (x < v[mid]) + high = mid - 1; + else + low = mid + 1; + } + + return x == v[mid] ? mid : -1; +}
\ No newline at end of file |
