/* SI 335 Unit 1
* searches.cc
* Contains C++ implementations of the three algorithms for the Sorted
* Array Search problem.
*
* All three algorithms return the index of x, if it is found, or else
* -1 to indicate NOT_FOUND.
*/
#include <algorithm>
using std::min;
int linearSearch (const int A[], int n, int x) {
int i = 0;
while (i < n && A[i] < x)
++i;
if (i < n && A[i] == x) return i;
else return -1;
}
int binarySearch (const int A[], int n, int x) {
int left = 0;
int right = n-1;
while (left < right) {
int middle = (left + right) / 2;
if (x <= A[middle])
right = middle;
else
left = middle + 1;
}
if (A[left] == x) return left;
else return -1;
}
int gallopSearch (const int A[], int n, int x) {
int i = 1;
while (i < n && A[i] <= x)
i *= 2;
int left = i/2;
int right = min(i,n) - 1;
int ret = binarySearch (A+left, right-left+1, x);
if (ret >= 0) return ret + left;
else return -1;
}