diff --git a/book/book_second_edition.pdf b/book/book_second_edition.pdf index 490f54d..60ca209 100644 Binary files a/book/book_second_edition.pdf and b/book/book_second_edition.pdf differ diff --git a/src/searching_and_sorting/searching/binary_search.py b/src/searching_and_sorting/searching/binary_search.py index 1ce26d6..79570cf 100644 --- a/src/searching_and_sorting/searching/binary_search.py +++ b/src/searching_and_sorting/searching/binary_search.py @@ -3,53 +3,63 @@ __author__ = "bt3" - -def binary_search_rec(array, item, lo=0, hi = None): +def binary_search(array, item, hi=None, lo=0): ''' - >>> binary_search_rec([2,3,5,6,8,10,15,23], 15) - (True, 6) - >>> binary_search_rec([2,3,5,6,8,10,15,23], 4) + >>> binary_search([2,3,5,6,8,10,15,23], 15) + 6 + >>> binary_search([2,3,5,6,8,10,15,23], 4) + False + >>> binary_search([1,3,4,5,7,8 ,10,12,23], 10) + 6 + >>> binary_search([1,3,4,5,7,8 ,10,12,23], 22) False ''' + hi = hi or len(array) - if hi < lo : + if hi < lo: return False mid = (hi + lo)//2 - - if array[mid] == item: - return True, mid - elif array[mid] < item: - return binary_search_rec(array, item, mid + 1, hi) + if item == array[mid]: + return mid + elif item < array[mid]: + return binary_search(array, item, hi=mid-1, lo=lo) else: - return binary_search_rec(array[:mid], item, lo, mid -1) + return binary_search(array, item, hi=hi, lo=mid+1) + def binary_search_iter(array, item): ''' >>> binary_search_iter([2,3,5,6,8,10,15,23], 15) - (True, 6) + 6 >>> binary_search_iter([2,3,5,6,8,10,15,23], 4) False + >>> binary_search_iter([1,3,4,5,7,8 ,10,12,23], 10) + 6 + >>> binary_search_iter([1,3,4,5,7,8 ,10,12,23], 22) + False ''' - hi = len(array) - lo = 0 + lo, hi = 0, len(array) while lo < hi: mid = (hi+lo)//2 if array[mid] == item: - return True, mid + return mid elif array[mid] > item: hi = mid else: - lo = mid + 1 + lo=mid+1 return False + + + if __name__ == '__main__': import doctest doctest.testmod() diff --git a/src/searching_and_sorting/sorting/merge_sort.py b/src/searching_and_sorting/sorting/merge_sort.py index 8d7cfed..fd5ac54 100644 --- a/src/searching_and_sorting/sorting/merge_sort.py +++ b/src/searching_and_sorting/sorting/merge_sort.py @@ -3,62 +3,34 @@ __author__ = "bt3" -def merge_sort(seq): +def merge_sort(array): ''' - >>> seq = [3, 5, 2, 6, 8, 1, 0, 3, 5, 6, 2] - >>> merge_sort(seq) - [0, 1, 2, 2, 3, 3, 5, 5, 6, 6, 8] + >>> merge_sort([3 ,5, 1, 2, 10, 6]) + [1, 2, 3, 5, 6, 10] ''' - if len(seq) < 2: - return seq - mid = len(seq)//2 - lft, rgt = seq[:mid], seq[mid:] - if len(lft)>1: - lft = merge_sort(lft) - if len(rgt)>1: - rgt = merge_sort(rgt) + if len(array) < 2: + return array + + mid = len(array)//2 + left = merge_sort(array[:mid]) + right = merge_sort(array[mid:]) res = [] - while lft and rgt: - if lft [-1]>= rgt[-1]: - res.append(lft.pop()) - else: - res.append(rgt.pop()) - res.reverse() - return(lft or rgt) + res - - - -# separating the merge part in another function -def merge_sort_sep(seq): - ''' - >>> seq = [3, 5, 2, 6, 8, 1, 0, 3, 5, 6, 2] - >>> merge_sort_sep(seq) - [0, 1, 2, 2, 3, 3, 5, 5, 6, 6, 8] - ''' - if len(seq) < 2 : - return seq - mid = len(seq)//2 - left = merge_sort(seq[:mid]) - right = merge_sort(seq[mid:]) # notice that mid is included! - return merge(left, right) # merge iteratively - - -def merge(left, right): - if not left or not right: - return left or right # nothing to be merged - result = [] i, j = 0, 0 while i < len(left) and j < len(right): if left[i] <= right[j]: - result.append(left[i]) + res.append(left[i]) i += 1 else: - result.append(right[j]) + res.append(right[j]) j += 1 - if left[i:] : result.extend(left[i:]) # REMEMBER TO EXTEND, NOT APPEND - if right[j:] : result.extend(right[j:]) - return result + + if left[i:]: + res.extend(left[i:]) + if right[j:]: + res.extend(right[j:]) + return res + ''' Merge sort for files ''' diff --git a/src/searching_and_sorting/sorting/quick_sort.py b/src/searching_and_sorting/sorting/quick_sort.py index e78ec38..5596d1a 100644 --- a/src/searching_and_sorting/sorting/quick_sort.py +++ b/src/searching_and_sorting/sorting/quick_sort.py @@ -18,11 +18,11 @@ def qs(array): left = [a for a in new_array if a <= piv_element] right = [a for a in new_array if a > piv_element] - return qs(left) + [array[piv]] + qs(right) -""" we can also divide them into two functions """ + +# we can also divide them into two functions def partition(seq): pi,seq = seq[0],seq[1:] lo = [x for x in seq if x <= pi] @@ -41,9 +41,6 @@ def quick_sort_divided(seq): - - - if __name__ == '__main__': import doctest doctest.testmod() \ No newline at end of file