単純なソートのおさらい(Python)

以前に Rubyバブルソート、選択ソート、挿入ソートを実装してみました(参照)が、Python でもやってみました。リストの(浅い)コピーってどうやるのかと思った。それから、PythonRuby とちがって「モンキーパッチ」ができないのですね。あと、range(n = len(ar)) のような書き方もできない。

def bubble_sort(a):
    ar = a[:]
    for i in range(len(ar) - 1, 0, -1):
        for j in range(0, i):
            if ar[j] > ar[j + 1]:
                ar[j], ar[j + 1] = ar[j + 1], ar[j]
    return ar

def selection_sort(a):
    ar = a[:]
    n = len(ar)
    for i in range(n):
        min_idx = i
        for j in range(i + 1, n):
            if ar[j] < ar[min_idx]:
                min_idx = j
        ar[i], ar[min_idx] = ar[min_idx], ar[i]
    return ar

def insertion_sort(a):
    ar = a[:]
    for i in range(1, len(ar)):
        j = i
        while j > 0 and ar[j - 1] > ar[j]:
            ar[j], ar[j - 1] = ar[j - 1], ar[j]
            j -= 1
    return ar

print(insertion_sort([16, 14, 10, 8, 7, 9, 3, 2, 4, 1]))
#=>[1, 2, 3, 4, 7, 8, 9, 10, 14, 16]