python插入排序算法

jkiu 9年前發布 | 1K 次閱讀 Python

插入排序的基本概念:有一個已經有序的數據序列,要求在這個已經排好的數據序列中插入一個數,但要求插入后此數據序列仍然有序,這個時候就要用到一種新的 排序方法——插入排序法,插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,算法適用于少量數據的 排序,時間復雜度為O(n^2)。是穩定的排序方法。插入算法把要排序的數組分成兩部分:第一部分包含了這個數組的所有元素,但將最后一個元素除外,而第 二部分就只包含這一個元素。在第一部分排序后,再把這個最后元素插入到此刻已是有序的第一部分里的位置

# -- 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))</pre> 


 本文由用戶 jkiu 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!