Сортировка подсчетом $O(n)$

In [1]:
def count(a):
    res = []
    counting = [0] * (max(a) - min(a) + 2)
    for i in a:
        counting[i] += 1
    for i in range(min(a), max(a) + 1):
        for j in range(counting[i]):
            res.append(i)
    return res
In [2]:
a = [20, 5000, 10000, -1000, 0, -30]
count(a)
Out[2]:
[-1000, -30, 0, 20, 5000, 10000]

Квадратичные сортировки $O(n^2)$

In [3]:
def bubble(a):
    n = len(a)
    for i in range(n):
        for j in range(0, n - i - 1): #[0, n-2]
            if a[j] > a[j+1]:
                a[j+1], a[j] = a[j], a[j+1]
In [4]:
def insertion(a):
    n = len(a)
    for i in range(n - 1):
        m = a[i + 1]
        pos = 0
        while a[pos] < m:
            pos += 1
        for j in range(i, pos - 1, -1):
            a[j + 1] = a[j]
        a[pos] = m
In [5]:
def selection(a):
    for i in range(n - 1):
        for j in range(i+1, n):
            if a[j] < a[i]:
                a[i], a[j] = a[j], a[i]

Быстрые сортировки $O(n log(n))$