挿入ソートの基本概念: すでに整列したデータ列があり、この整列したデータ列に数値を挿入する必要があるが、このとき、挿入後もデータ列が整列している必要がある。新しいメソッドが使用されます。 挿入ソートの基本的な操作は、ソートされた順序付きデータにデータを挿入し、数値に 1 を加えた新しい順序付きデータを取得することです。少量のデータの場合、ソートの時間計算量は O(n^2) です。安定した選別方法です。挿入アルゴリズムは、並べ替えられる配列を 2 つの部分に分割します。最初の部分には最後の要素を除く配列のすべての要素が含まれ、2 番目の部分にはこの 1 つの要素のみが含まれます。最初の部分がソートされたら、ソートされた最初の部分の位置に最後の要素を挿入します
# -*- encoding: utf-8 -*- def insertion_sort(iterable, cmp=cmp): """插入排序,伪码如下: INSERTION-SORT(A) 1 for j ← 2 to length[A] // 从第二个数开始 2 do key ← A[j] // 该数作为待排序的数 3 ▷ Insert A[j] into the sorted sequence A[1..j-1]. // 将key插入已排序子数组 4 i ← j-1 // key前一位索引 5 while i > 0 and A[i] > key // 前一位存在且大于key时 6 do A[i+1] ← A[i] // 后移一位 7 i ← i-1 // 索引再向前一位 8 A[i+1] ← key // 直到前一位不存在或<=key了,key插入 T(n) = θ(n^2) Args: iterable (Iterator): 可迭代对象。 cmp (Function): 比较函数。默认为内建函数cmp()。 Returns: 一个排序后的列表。 """ if (iterable == None): return None lst = [] # 结果列表 length = len(iterable) for key in iterable: i = len(lst) # 列表长度 # 从末尾往前与key比较,直到不大于key while i > 0 and cmp(lst[i-1], key) > 0: i = i - 1 lst.insert(i, key); # i处插入key return lst if __name__ == '__main__': import random, timeit items = range(10000) random.shuffle(items) def test_sorted(): print(items) sorted_items = sorted(items) print(sorted_items) def test_insertion_sort(): print(items) sorted_items = insertion_sort(items) print(sorted_items) test_methods = [test_sorted, test_insertion_sort] for test in test_methods: name = test.__name__ # test.func_name t = timeit.Timer(name + '()', 'from __main__ import ' + name) print(name + ' takes time : %f' % t.timeit(1))