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
#!/usr/bin/python3
 
# SI 335: Computer Algorithms
# Unit 1
 
from math import floor
import random
 
def linearSearch(A, x):
    i = 0
    while i < len(A) and A[i] < x:
        i = i + 1
    if i < len(A) and A[i] == x: return i
    else: return 'NOT FOUND'
 
 
def binarySearch(A, x, left=0, right=None):
    if right is None: right = len(A) - 1
    while left < right:
        middle = floor((left + right) / 2)
        if x <= A[middle]:
            right = middle
        elif x > A[middle]:
            left = middle+1
    if A[left] == x: return left
    else: return 'NOT FOUND'
 
 
def gallopSearch(A, x):
    i = 1
    while i < len(A) and A[i] <= x:
        i = i * 2
    left = floor(i / 2)
    right = min(i, len(A)) - 1
    return binarySearch(A, x, left, right)
 
 
# This is provided for testing purposes.
def randomSortedArray(size, maxval):
    return sorted(random.sample(range(maxval), size))
 
def searchTest():
    searchAlgs = [linearSearch, binarySearch, gallopSearch]
    allgood = True
    data = randomSortedArray(10000, 10000000)
    i = random.randrange(len(data))
    val = random.choice(data)
    while val in data:
        val += 1
    for alg in searchAlgs:
        good = (
            alg(data, -10) == 'NOT FOUND' and
            alg(data, data[i]) == i and
            alg(data, data[0]) == 0 and
            alg(data, data[-1]) == len(data)-1 and
            alg(data, val) == 'NOT FOUND'
        )
        if not good:
            print("FAILED CHECK for", alg.__name__)
            allgood = False
    return allgood
 
if __name__ == '__main__':
    if searchTest():
        print("All checks passed!")