Skip to content

Commit 28b84ce

Browse files
author
Mari Wahl
committed
searching and sorting organized
1 parent 9182586 commit 28b84ce

23 files changed

+193
-471
lines changed

src/searching_and_sorting/binary_search.py

Lines changed: 0 additions & 56 deletions
This file was deleted.

src/searching_and_sorting/quick_sort.py

Lines changed: 0 additions & 27 deletions
This file was deleted.
Lines changed: 42 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,56 @@
1-
#!/usr/bin/python
1+
#!/usr/bin/env python
22

3-
__author__ = "Mari Wahl"
4-
__email__ = "[email protected]"
3+
__author__ = "bt3"
54

65

76

8-
def binary_search(seq, key):
9-
''' binary search iterative algorithm '''
10-
''' observe that the index is returned '''
11-
hi = len(seq)
7+
def binary_search_rec(array, item, lo=0, hi = None):
8+
'''
9+
>>> binary_search_rec([2,3,5,6,8,10,15,23], 15)
10+
(True, 6)
11+
>>> binary_search_rec([2,3,5,6,8,10,15,23], 4)
12+
False
13+
'''
14+
hi = hi or len(array)
15+
if hi < lo :
16+
return False
17+
18+
mid = (hi + lo)//2
19+
20+
if array[mid] == item:
21+
return True, mid
22+
elif array[mid] < item:
23+
return binary_search_rec(array, item, mid + 1, hi)
24+
else:
25+
return binary_search_rec(array[:mid], item, lo, mid -1)
26+
27+
28+
29+
def binary_search_iter(array, item):
30+
'''
31+
>>> binary_search_iter([2,3,5,6,8,10,15,23], 15)
32+
(True, 6)
33+
>>> binary_search_iter([2,3,5,6,8,10,15,23], 4)
34+
False
35+
'''
36+
hi = len(array)
1237
lo = 0
38+
1339
while lo < hi:
14-
mid = (hi+lo) // 2
15-
if seq[mid] == key:
16-
return mid
17-
elif key < seq[mid]:
40+
mid = (hi+lo)//2
41+
if array[mid] == item:
42+
return True, mid
43+
elif array[mid] > item:
1844
hi = mid
1945
else:
20-
lo = mid + 1
21-
22-
23-
def binary_search_rec(seq, key, lo=0, hi=None):
24-
''' binary search recursive algorithm '''
25-
hi = hi or len(seq)
26-
if hi < lo: return None
27-
mid = (hi + lo) // 2
28-
if seq[mid] == key:
29-
return mid
30-
elif seq[mid] < key:
31-
return binary_search_rec(seq, key, mid + 1, hi)
32-
else:
33-
return binary_search_rec(seq, key, lo, mid - 1)
34-
46+
lo = mid + 1
47+
return False
3548

36-
def test_binary_search():
37-
seq = [1,2,5,6,7,10,12,12,14,15]
38-
key = 6
39-
assert(binary_search(seq, key) == 3)
40-
assert(binary_search_rec(seq, key) == 3)
41-
print('Tests passed!')
4249

4350

44-
if __name__ == '__main__':
45-
test_binary_search()
46-
4751

4852

53+
if __name__ == '__main__':
54+
import doctest
55+
doctest.testmod()
4956

src/searching_and_sorting/searching/binary_search_matrix.py

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,89 @@
1-
#!/usr/bin/python
1+
#!/usr/bin/env python
22

3-
__author__ = "Mari Wahl"
4-
__email__ = "[email protected]"
3+
__author__ = "bt3"
54

65

7-
''' Searches an element in a matrix where in every row, the values are increasing from left to right, but the last number in a row is smaller than the first number in the next row.
8-
9-
(1) The naive brute force solution (sequential search) scan all numbers and cost O(nm). However, since the numbers are already sorted, the matrix can be viewed as a 1D sorted array. The binary search algorithm is suitable. The efficiency is O(logmn).
10-
6+
def binary_search_matrix_rec(m, key, lo=0, hi=None):
7+
'''
118
>>> m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
129
>>> binary_search_matrix_rec(m, 6)
1310
(1, 2)
1411
>>> binary_search_matrix_rec(m, 12)
15-
>>> binary_search_matrix_iter(m, 6)
16-
(1, 2)
17-
>>> binary_search_matrix_iter(m, 12)
18-
>>> binary_search_matrix_iter(m, 1)
19-
(0, 0)
20-
21-
(2) Another solution is "discarding" arrays in the way. The efficiency is O(logm).
22-
>>> m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
23-
>>> searching_matrix(m, 6)
24-
(1, 2)
25-
>>> searching_matrix(m, 12)
26-
27-
'''
28-
12+
'''
13+
if not m:
14+
return None
2915

30-
def binary_search_matrix_rec(m, key, lo=0, hi=None):
31-
if not m: return None
3216
rows = len(m)
3317
cols = len(m[0])
3418
hi = hi or rows*cols
35-
if hi > lo: # -----> REMEMBER THIS OR INDEX WILL EXPLODE!!!!!!!!
19+
20+
if hi > lo:
21+
3622
mid = (hi + lo)//2
3723
row = mid//cols
3824
col = mid%cols
3925
item = m[row][col]
40-
if key == item: return row, col
41-
elif key < item: return binary_search_matrix_rec(m, key, lo, mid-1)
42-
else: return binary_search_matrix_rec(m, key, mid+1, hi)
26+
27+
if key == item:
28+
return row, col
29+
elif key < item:
30+
return binary_search_matrix_rec(m, key, lo, mid-1)
31+
else:
32+
return binary_search_matrix_rec(m, key, mid+1, hi)
33+
4334
return None
4435

4536

4637

4738
def binary_search_matrix_iter(m, key):
48-
if not m: return None
39+
'''
40+
41+
'''
42+
43+
if not m:
44+
return None
4945
rows = len(m)
5046
cols = len(m[0])
5147
lo, hi = 0, rows*cols
48+
5249
while lo < hi:
5350
mid = (hi + lo)//2
5451
row = mid//rows
5552
col = mid%rows
5653
item = m[row][col]
57-
if key == item: return (row, col)
58-
elif key < item: hi = mid
59-
else: lo = mid +1
54+
if key == item:
55+
return (row, col)
56+
elif key < item:
57+
hi = mid
58+
else:
59+
lo = mid +1
60+
6061
return None
6162

6263

6364
def searching_matrix(m, key):
64-
if not m: return None
65+
'''
66+
>>> m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
67+
>>> searching_matrix(m, 6)
68+
(1, 2)
69+
>>> searching_matrix(m, 12)
70+
'''
71+
72+
if not m:
73+
return None
6574
rows = len(m)
6675
cols = len(m[0])
6776
i, j = 0, cols -1
77+
6878
while i < rows and j > 0:
6979
item = m[i][j]
70-
if key == item: return (i, j)
71-
elif key < item: j -= 1
72-
else: i += 1
80+
if key == item:
81+
return (i, j)
82+
elif key < item:
83+
j -= 1
84+
else:
85+
i += 1
86+
7387
return None
7488

7589

src/searching_and_sorting/searching/find_item_rotated_sorted_array.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
1-
#!/usr/bin/python
1+
#!/usr/bin/env python
22

3-
__author__ = "Mari Wahl"
4-
__email__ = "[email protected]"
3+
__author__ = "bt3"
54

65

76

8-
''' Given a sorted array that was rotated, find an item with binary search:
7+
'''
8+
Given a sorted array that was rotated, find an item with binary search:
99
'''
1010

1111
def find_element_rot_array(seq, key, lo=0, hi=None):
12+
1213
hi = hi or len(seq)
13-
if hi <= lo: return None # base case: <= for odd and even numbers!
14+
if hi <= lo:
15+
return None # base case: <= for odd and even numbers!
16+
1417
mid = (hi + lo) // 2
15-
if key == seq[mid]: return mid
18+
19+
if key == seq[mid]:
20+
return mid
1621

1722
# if left is ordered --> we work here
1823
if seq[lo] <= seq[mid]:
24+
1925
# now, is the key there?
2026
if key < seq[mid] and key >= seq[lo]:
2127
return find_element_rot_array(seq, key, lo, mid)
@@ -25,6 +31,7 @@ def find_element_rot_array(seq, key, lo=0, hi=None):
2531

2632
# right is ordered --> we work here
2733
else:
34+
2835
# now, is the key there?
2936
if key > seq[mid] and key <= seq[hi-1]: # stupid hi-1!!!
3037
return find_element_rot_array(seq, key, mid+1, hi)

src/searching_and_sorting/searching/find_max_unimodal_array.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
1-
#!/usr/bin/python
2-
3-
__author__ = "Mari Wahl"
4-
__email__ = "[email protected]"
5-
1+
#!/usr/bin/env python
62

3+
__author__ = "bt3"
74

85
def find_max_unimodal_array(A):
9-
if len(A) <= 2 : return None
6+
if len(A) <= 2 :
7+
return None
108
left = 0
119
right = len(A)-1
10+
1211
while right > left +1:
12+
1313
mid = (left + right)//2
1414
if A[mid] > A[mid-1] and A[mid] > A[mid+1]:
1515
return A[mid]
1616
elif A[mid] > A[mid-1] and A[mid] < A[mid+1]:
1717
left = mid
1818
else:
1919
right = mid
20+
2021
return None
2122

2223

src/searching_and_sorting/searching/find_sqrt_bin_search.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
#!/usr/bin/python
2-
3-
__author__ = "Mari Wahl"
4-
__email__ = "[email protected]"
5-
1+
#!/usr/bin/env python
62

3+
__author__ = "bt3"
74

5+
''' implement square root using binary search '''
86

97

108
def find_sqrt_bin_search(n, error=0.001):
11-
''' implement square root using binary search '''
129
lower = n < 1 and n or 1
1310
upper = n < 1 and 1 or n
1411
mid = lower + (upper - lower) / 2.0

0 commit comments

Comments
 (0)