How do I return the index of the target element in a Python array?
Your algortihm gives the index in the last splitted list. So for your answer if you would print the list for 9, we would get the following:
[1, 3, 5, 6, 8, 9, 10, 12, 34, 56, 78, 456]
[1, 3, 5, 6, 8, 9]
[8, 9]
Wich returns the index 1. which is correct for the last list [8, 9]
.
This can easely be fixed by remebering the length of list.
aList = [1,3,5,6,8,9,10,12,34,56,78,456]
def recursiveBinarySearch(aList, target, index):
#aList = sorted(aList)
if len(aList) == 0:
return False
else:
midpoint = len(aList) // 2
if aList[midpoint] == target:
return aList.index(target)+index
else:
if target < aList[midpoint]:
return recursiveBinarySearch(aList[:midpoint],target, index)
else:
return recursiveBinarySearch(aList[midpoint:],target, index + midpoint)
print(recursiveBinarySearch(aList,56,0))
This uses a bit less memory than the previous solution. And ofcourse this is also faster, although that is marginal.
That is because every time you make a recursive call, a different modified list is passed and the index will change in every call. For example, if you search for a number in second half of the array, the final returned value will be less than len(aList)/2
because only this part of the array will be passed in the next iteration.
The workaround is to pass start
and end
points of the list instead of splitting the list.
aList = [1,3,5,6,8,9,10,12,34,56,78,456]
def recursiveBinarySearch(aList, target, start, end):
#aList = sorted(aList)
if end-start+1 <= 0:
return False
else:
midpoint = start + (end - start) // 2
if aList[midpoint] == target:
return midpoint
else:
if target < aList[midpoint]:
return recursiveBinarySearch(aList, target, start, midpoint-1)
else:
return recursiveBinarySearch(aList ,target, midpoint+1, end)
print(recursiveBinarySearch(aList,455, 0, len(aList)))
Tried editing the accepted answer because it fails when searching for numbers that are higher than those in the list but for some reason the OP did not accept the edits, meaning that answer is still wrong. That being the case, I will post the answer here. Not only does this answer fix the IndexError
when asked to find a value greater than one that is not in the list, it also changes the args to be kwargs so we don't have to pass them in every time we call the function
aList = [-1,1,3,5,6,8,9,10,12,34,56,78,456]
def binary_search(arr,item,low = 0, high = None):
if high == None:
high = len(arr)
mid = low + (high-low) //2
if high - low + 1 <= 0 or mid==high:
return False
else:
guess = arr[mid]
if guess == item:
return mid
if item < guess:
return binary_search(arr, item, low, mid)
else:
return binary_search(arr, item, (mid+1), high)
(binary_search(aList,457))