Python

Pythonで学ぶアルゴリズム ソート シェルソート

シェルソートを実装してみます。

概要

シェルソート改良挿入ソート英語: Shellsort, Shell sort, Shell’s method)は、in-placeな比較ソートアルゴリズムの一種である。シェルソートは、交換によるソート(バブルソート)あるいは挿入によるソート(挿入ソート)の一般化と見なすことができる[ 2 ]。ソートの方法は、まず、間隔の離れた要素の組に対してソートを行い、だんだんと比較する要素間の間隔を小さくしながらソートを繰り返す、というものである。離れた場所の要素からソートを始めることで、単純に近くの要素を比較する場合よりも速く、要素を所定の位置に移動させることができる。ただし、安定ソートではない。ドナルド・シェル(Donald L. Shell)が、1959年に、シェルソートの最初のバージョンを公開した[ 3 ][ 4 ] 。シェルソートの実行時間は、比較時に選ぶ間隔によって大きく異なる。多くの実用的な方法が提案されているが、正確な時間計算量を求める方法は、未解決問題である。

シェルソート – Wikipedia

サンプルコード

import random


data_len = 10
data = random.sample(range(1, 42), data_len)
print(data)


def shell_sort(collection):

    # Marcin Ciura's gap sequence
    # https://stackoverflow.com/questions/2539545/fastest-gap-sequence-for-shell-sort
    gaps = [701, 301, 132, 57, 23, 10, 4, 1]

    for gap in gaps:
        for i in range(gap, len(collection)):
            j = i
            while j >= gap and collection[j] < collection[j - gap]:
                collection[j], collection[j -
                                          gap] = collection[j - gap], collection[j]
                j -= gap
                print(collection)

    return collection


shell_sort(data)

実行結果(例)

[8, 27, 1, 2, 39, 36, 14, 19, 4, 30]
[8, 27, 1, 2, 4, 36, 14, 19, 39, 30]
[4, 27, 1, 2, 8, 36, 14, 19, 39, 30]
[4, 27, 1, 2, 8, 30, 14, 19, 39, 36]
[4, 1, 27, 2, 8, 30, 14, 19, 39, 36]
[1, 4, 27, 2, 8, 30, 14, 19, 39, 36]
[1, 4, 2, 27, 8, 30, 14, 19, 39, 36]
[1, 2, 4, 27, 8, 30, 14, 19, 39, 36]
[1, 2, 4, 8, 27, 30, 14, 19, 39, 36]
[1, 2, 4, 8, 27, 14, 30, 19, 39, 36]
[1, 2, 4, 8, 14, 27, 30, 19, 39, 36]
[1, 2, 4, 8, 14, 27, 19, 30, 39, 36]
[1, 2, 4, 8, 14, 19, 27, 30, 39, 36]
[1, 2, 4, 8, 14, 19, 27, 30, 36, 39]