My binary search algorithm manages to find some items but does not find others:
myList = [1,3,4,7,12,13,14,16,19,20,28,29,40,45,48,50,67,89,91,94]
item = 67
found = False
lowerBound = 0
upperBound = len(myList) - 1
index = 0
while not found and lowerBound != upperBound:
index = (upperBound+lowerBound) // 2
if item == myList[index]:
found=True
if item > myList[index]:
lowerBound = index+1
if item < myList[index]:
upperBound = index-1
if found:
print('Item found')
else:
print('Item not found')
For example, it manages to find 91, 89, 50, 48, 40, 29, etc., but doesn't find 94, 67, 45, or 28.
There seems to be a pattern in the numbers it finds and those it doesn't. Did I make a mistake somewhere in the code?
The problem is caused by the statement in the while loop. You wrote while lowerBound != upperBound, but that is wrong because if the value at that index is the right value, then you just exit the loop without checking. That can be fixed by using a different condition which is lowerBound <= upperBound. That is a safer and more correct condition to use in this case. The code with the correction made is bellow:
myList = [1,3,4,7,12,13,14,16,19,20,28,29,40,45,48,50,67,89,91,94]
item = 94
found = False
lowerBound = 0
upperBound = len(myList) - 1
index = 0
while not found and lowerBound <= upperBound:
index = (upperBound+lowerBound) // 2
if item == myList[index]:
found=True
if item > myList[index]:
lowerBound = index+1
if item < myList[index]:
upperBound = index-1
if found:
print('Item found')
else:
print('Item not found')