Mercurial > hg > config
comparison python/example/binarysearch.py @ 566:e3341b7ce4ef
binarysearch
| author | Jeff Hammel <jhammel@mozilla.com> |
|---|---|
| date | Mon, 30 Dec 2013 12:22:13 -0800 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 565:7b70e5c0d410 | 566:e3341b7ce4ef |
|---|---|
| 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() |
