ホームページ  >  記事  >  バックエンド開発  >  Pythonアルゴリズム

Pythonアルゴリズム

高洛峰
高洛峰オリジナル
2016-10-19 17:20:551104ブラウズ

挿入ソートの基本概念: すでに整列したデータ列があり、この整列したデータ列に数値を挿入する必要があるが、このとき、挿入後もデータ列が整列している必要がある。新しいメソッドが使用されます。 挿入ソートの基本的な操作は、ソートされた順序付きデータにデータを挿入し、数値に 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__ == &#39;__main__&#39;:
    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 + &#39;()&#39;, &#39;from __main__ import &#39; + name)
        print(name + &#39; takes time : %f&#39; % t.timeit(1))


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。