#include #include #include int find(int * keys, int target, int len){ int high = len; int low = -1; int probe; while (high - low > 1){ //printf("low: %d high: %d\n", low, high); probe = (low + high) >> 1; if (keys[probe] > target) { high = probe; } else { low = probe; } } if (low == -1 || keys[low] != target) { return -1; } else { return low; } } int find2(int * keys, int target, int len){ int high = len; int low = -1; int probe; while (high - low > 1){ //printf("low: %d high: %d\n", low, high); probe = (low + high) >> 1; if (keys[probe] == target) { return probe;} if (keys[probe] > target) { high = probe; } else { low = probe; } } if (low == -1 || keys[low] != target) { return -1; } else { return low; } } int main(int argc, char ** argv){ int max = 1000000; int array[max]; int spread = 1; array[0] = 0; int inc; for (int i = 1; i < max; i++) { inc = rand() % spread; inc = (inc > 0) ? inc : -inc; array[i] = array[i] + 1 + inc; } int k; int result; for (int j = 1; j < argc; j++){ result = (rand()) % (2*max); result = (result < 0) ? -result : result; k = find(array, result, max); printf("%d %s found.\n", result, (k == -1) ? " NOT " : " is "); k = find2(array, result, max); printf("%d %s found(2).\n", result, (k == -1) ? " NOT " : " is "); } clock_t t; double time_taken; int reps = 10000000; printf("spread: %d\n", spread); t = clock(); printf("%d finds:", reps); for (int i = 0; i < reps; i++){ result = (rand()) % (2*max); result = (result < 0) ? -result : result; k = find(array, result, max); } t = clock() - t; time_taken = ((double) t)/CLOCKS_PER_SEC; printf("done. Time: %f\n", time_taken); t = clock(); printf("%d find(2)s:", reps); for (int i = 0; i < reps; i++){ result = (rand()) % (2*max); result = (result < 0) ? -result : result; k = find2(array, result, max); } t = clock() - t; time_taken = ((double) t)/CLOCKS_PER_SEC; printf("done. Time: %f\n", time_taken); return (0); }