#merge sort
#the merge algorithm
def merge(L1, L2, L):
i = 0
j = 0
while i+j < len(L):
if j == len(L2) or (i < len(L1) and L1[i] < L2[j]):
L[i+j] = L1[i]
i += 1
else:
L[i+j] = L2[j]
j += 1
#main function
def merge_sort(L):
n = len(L)
if n < 2:
return # list is already sorted
# divide
mid = n // 2 #midpoint
L1 = L[0:mid] # the first half
L2 = L[mid:n] # the second half
# conquer with recursion
merge_sort(L1) # sort first sub-list
merge_sort(L2) # sort second sub-list
# merge result
merge(L1, L2, L)
#example
L = [7, 5, 1, 4, 2, 8, 0, 9, 3, 6]
print('Before: ', L)
merge_sort(L)
print('After: ', L)