Python/divide_and_conquer/mergesort.py

52 lines
1.3 KiB
Python
Raw Normal View History

def merge(arr, left, mid, right):
# overall array will divided into 2 array
# left_arr contains the left portion of array from left to mid
# right_arr contains the right portion of array from mid + 1 to right
left_arr = arr[left : mid + 1]
right_arr = arr[mid + 1 : right + 1]
k = left
i = 0
j = 0
while i < len(left_arr) and j < len(right_arr):
# change sign for Descending order
if left_arr[i] < right_arr[j]:
arr[k] = left_arr[i]
i += 1
else:
arr[k] = right_arr[j]
j += 1
k += 1
while i < len(left_arr):
arr[k] = left_arr[i]
i += 1
k += 1
while j < len(right_arr):
arr[k] = right_arr[j]
j += 1
k += 1
return arr
def mergesort(arr, left, right):
"""
>>> mergesort([3, 2, 1], 0, 2)
[1, 2, 3]
>>> mergesort([3, 2, 1, 0, 1, 2, 3, 5, 4], 0, 8)
[0, 1, 1, 2, 2, 3, 3, 4, 5]
"""
if left < right:
mid = (left + right) // 2
# print("ms1",a,b,m)
mergesort(arr, left, mid)
# print("ms2",a,m+1,e)
mergesort(arr, mid + 1, right)
# print("m",a,b,m,e)
merge(arr, left, mid, right)
return arr
if __name__ == "__main__":
import doctest
doctest.testmod()