Linear searching looks through a list/array item by item until a target value is found, or the end of the list is reached. Linear searches can use unsorted lists, but are very inefficient.
Binary searches only work on sorted lists, with the list repeatedly split into smaller and smaller lists, until the target value is found or the list is empty.
Pointers are used to identify the range of the list to be sorted (low/high, bottom/top, left/right, start/end). An index is chosen between the two pointers, resulting in a match or a value that is too high/low. In the latter case the range pointers are updated, excluding the index that has just been checked.
General Algorithm
bottom = 0 top = listsize - 1 found = False loop while bottom<=top and found = False do middle = int( (top+bottom)/2 ) #pick a midpoint if list[middle] = target then found = True #item found else if list[middle] > target then top = middle - 1 #look in bottom half else bottom = middle + 1 #look in top half end if end loop if found = True then print "Found at index: " + middle else print "Not found" end if
#set pointers to start and end of full list start = 0 end = len(array) found = False # as long as pointers haven't crossed, and target has not been found while (start <= end) and not found: # pick the midpoint between pointers middle = (start + end) // 2 # has target been found? if target == array[middle]: found = True # is target in lower half of range (start-middle)? elif target < array[middle]: end = middle - 1 # target must be in upper half (middle-end) else: start = middle + 1 # item has or has not been found if found: print "Found at index" , middle else: print "Not found"
Python functions terminate as soon as a value is returned. This can remove the need for a “found” variable:
def binary_search(array, target): start = 0 end = len(array) while start <= end: middle = (start + end) // 2 if target == array[middle]: return middle if target < array[middle]: end = middle - 1 else: start = middle + 1 return -1