Skip to content

Instantly share code, notes, and snippets.

@iamkhush
Created March 1, 2020 19:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iamkhush/7b02372084cc5c45d5c28922e138835d to your computer and use it in GitHub Desktop.
Save iamkhush/7b02372084cc5c45d5c28922e138835d to your computer and use it in GitHub Desktop.
Implement Merge Sort
import math
def merge_sort(data, p: int, q: int):
# If something goes wrong
if q < p :
return data
# Base case
if q - p == 1:
if data[q] < data[p]:
return data[:p] + [data[q], data[p]] + data[q+1:]
return data
# divide and sort recursively
sorted_list_1 = merge_sort(data, p, math.floor((p+q)/2))[p: math.floor((p+q)/2 + 1)]
sorted_list_2 = merge_sort(data, math.floor((p+q)/2)+1, q)[math.floor((p+q)/2)+1: q+1]
# merge sorted_list_1 and sorted_list_2
iter_1 = iter(sorted_list_1)
iter_2 = iter(sorted_list_2)
result = []
first = next(iter_1)
second = next(iter_2)
# print(p, q, first, second, sorted_list_1, sorted_list_2)
while True:
if first < second:
result.append(first)
try:
first = next(iter_1)
except StopIteration:
result.append(second)
result.extend([x for x in iter_2])
break
else:
result.append(second)
try:
second = next(iter_2)
except StopIteration:
result.append(first)
result.extend([x for x in iter_1])
break
# print(data, p, q, result, 'after sorting',data[:p] + result + data[q+1:])
return data[:p] + result + data[q+1:]
assert merge_sort([5,4,8,7,6,4,9,0], 0, 7) == [0,4,4,5,6,7,8,9]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment