| 
566
 | 
     1 #!/usr/bin/env python
 | 
| 
 | 
     2 
 | 
| 
 | 
     3 def find_index(ordered_array, to_find):
 | 
| 
 | 
     4     """
 | 
| 
 | 
     5     Return index of ``to_find`` via binary search.
 | 
| 
 | 
     6     Returns None if not in ``ordered_array``
 | 
| 
 | 
     7 
 | 
| 
 | 
     8     ordered_array -- array of ordered values
 | 
| 
 | 
     9     to
 | 
| 
 | 
    10     """
 | 
| 
 | 
    11     if not ordered_array:
 | 
| 
 | 
    12         return
 | 
| 
 | 
    13     minimum = 0
 | 
| 
 | 
    14     maximum = len(ordered_array)-1
 | 
| 
 | 
    15     while True:
 | 
| 
 | 
    16         middle = (minimum + maximum)/2
 | 
| 
 | 
    17         value = ordered_array[middle]
 | 
| 
 | 
    18         if value == to_find:
 | 
| 
 | 
    19             return middle
 | 
| 
 | 
    20         if maximum == minimum:
 | 
| 
 | 
    21             return
 | 
| 
 | 
    22         if value < to_find:
 | 
| 
 | 
    23             minimum = middle+1
 | 
| 
 | 
    24             continue
 | 
| 
 | 
    25         if value > to_find:
 | 
| 
 | 
    26             maximum = middle
 | 
| 
 | 
    27             continue
 | 
| 
 | 
    28 
 | 
| 
 | 
    29 if __name__ == '__main__':
 | 
| 
 | 
    30     import unittest
 | 
| 
 | 
    31 
 | 
| 
 | 
    32     class TestFindIndex(unittest.TestCase):
 | 
| 
 | 
    33         values = [1,2,4,8,16,17]
 | 
| 
 | 
    34         def test_spotcheck(self):
 | 
| 
 | 
    35             for index, value in enumerate(self.values):
 | 
| 
 | 
    36                 self.assertEqual(find_index(self.values, value), index)
 | 
| 
 | 
    37 
 | 
| 
 | 
    38     unittest.main()
 |