# vim:fileencoding=utf-8
import math


def insertion_sort(a):
    """ Θ(n^2) """
    for j in range(1, len(a)):
        key = a[j]
        i = j - 1
        while i >= 0 and a[i] > key:
            a[i + 1] = a[i]
            i = i - 1
        a[i + 1] = key


def merge_sort(m):
    n = len(m)
    if n <= 1:
        return m

    middle = math.ceil(n / 2)

    left = m[:middle]
    right = m[middle:]

    left = merge_sort(left)
    right = merge_sort(right)

    return merge(left, right)


def merge(left, right):
    result = []

    while len(left) > 0 or len(right) > 0:
        if len(left) > 0 and len(right) > 0:
            if left[0] <= right[0]:
                result.append(left.pop(0))
            else:
                result.append(right.pop(0))

        elif len(left) > 0:
            result.append(left.pop(0))

        elif len(right) > 0:
            result.append(right.pop(0))

    return result