def merge(a,b):
    # a and b are already sorted
    index_a = 0
    index_b = 0
    c = []
    while index_a < len(a) and index_b < len(b):
        if a[index_a] <= b[index_b]:
            c.append(a[index_a])
            index_a = index_a + 1
        else:
            c.append(b[index_b])
            index_b = index_b + 1
    # after loop, one of the lists a or b is used up!
    if index_a < len(a):
        # a still has values to use
        for i in range(index_a, len(a)):
            c.append(a[i])
    else:
        # b still has values to use
        for i in range(index_b, len(b)):
            c.append(b[i])
    return c

def msort(datalist):
    if len(datalist) <= 1:
        return datalist
    halfway = len(datalist) // 2
    list1 = datalist[0:halfway]
    list2 = datalist[halfway:len(datalist)]
    newlist1 = msort(list1)   # recursive!
    newlist2 = msort(list2)   # also recursive!
    newlist = merge(newlist1, newlist2)
    return newlist
