In [50]:
def merge(A, p, q, r):
    n1 = q - p + 1
    n2 = r - q
    L, R = [], []
    for i in range(n1):
        L.append(A[p + i - 1])
    for j in range(n2):
        R.append(A[q + j])
    i, j = 0, 0
    for k in range(p - 1, r):
        if i < len(L) and (j >= len(R) or L[i] <= R[j]):
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1

In [57]:
from math import floor
def mergeSort(A, p, r):
    if p < r:
        q = floor((p + r)/2)
        mergeSort(A, p, q)
        mergeSort(A, q + 1, r)
        merge(A, p, q, r)

In [58]:
A = [5, 4, 3, 2, 1, 0, -1]
print(A)
mergeSort(A, 1, len(A))
print(A)


[5, 4, 3, 2, 1, 0, -1]
[-1, 0, 1, 2, 3, 4, 5]

In [ ]: