import sys

class mergesort():

    def merge_sort(self, A, p, r):
        if p < r:
            q = (p + r) / 2
            self.merge_sort(A, p, q)
            self.merge_sort(A, q+1, r)
            self.merge(A, p, q, r)
            return A

    def merge(self, A, p, q, r):
        n1 = q - p + 1
        n2 = r - q

        L = [0 for i in range(n1+1)]
        R = [0 for i in range(n2+1)]

        for i in range(n1):
            L[i] = A[p+i]
        for j in range(n2):
            R[j] = A[q+j+1]

        L[n1] = sys.maxint
        R[n2] = sys.maxint

        i = 0; j = 0
        for k in range(p, r):
            if L[i] <= R[j]:
                A[k] = L[i]
                i += 1
            else:
                A[k] = R[j]
                j += 1

sort = mergesort()

A = [1,3,5,7,9,2,4,6,8,10]

print sort.merge_sort(A, 0, len(A)-1)
2f8ea1080d9bd6971cb7dd2d7f217c81697386cb
import sys

class mergesort():

    def merge_sort(self, A, p, r):
        if p < r:
            q = (p + r) / 2
            self.merge_sort(A, p, q)
            self.merge_sort(A, q+1, r)
            self.merge(A, p, q, r)
            return A

    def merge(self, A, p, q, r):
        n1 = q - p + 1
        n2 = r - q

        L = [0 for i in range(n1+1)]
        R = [0 for i in range(n2+1)]

        for i in range(n1):
            L[i] = A[p+i]
        for j in range(n2):
            R[j] = A[q+j+1]

        L[n1] = sys.maxint
        R[n2] = sys.maxint

        i = 0; j = 0
        for k in range(p, r):
            if L[i] <= R[j]:
                A[k] = L[i]
                i += 1
            else:
                A[k] = R[j]
                j += 1

sort = mergesort()

A = [1,3,5,7,9,2,4,6,8,10]

print sort.merge_sort(A, 0, len(A)-1)