0
0

シェルソートのやり方がよく分からなかったので下記で学習しました。
(ありがとうございます)


def insertion_sort(A, n, h):
    # アルゴリズムが正しく実装されていることを確認するために導入するカウンタ変数、ソート処理には関係がないことに注意
    num_of_move = 0

    for i in range(h,n):
        # A[i] を、整列済みの A[i-ah], ..., A[i-2h], A[i-h] の適切な位置に挿入する
        # 実装の都合上、A[i] の値が上書きされてしまうことがあるので、予め A[i] の値をコピーしておく 
        x = A[i]
        # A[i] の適切な挿入位置を表す変数 j を用意
        j = i - h

        # A[i] の適切な挿入位置が見つかるまで、A[i] より大きい要素を後ろにずらしていく
        while j >= 0 and A[j] > x:
            A[j+h] = A[j]
            j -= h
            num_of_move += 1
        
        # A[i] を挿入
        A[j+h] = x
    print(num_of_move)
    
def shell_sort(A, n):
    H = list(map(int,input().split()))
    
    for h in H:
        insertion_sort(A, n, h)
        
n = int(input())
A = list(map(int,input().split()))
k = int(input())
shell_sort(A,n)

基本的には、前に学習した挿入ソートを距離間隔のループの中で回していくだけなのだが、
学習したサイトでは、きれいに2つに分けられていた。8要素を4つにきれいに分けることができるのでグループにわけやすい。

しかし、こちらのケースだとどうだろうか。
7,6,10,2,5,4,8,3,9,1 この10個の要素において、
最初の間隔が4でグループを作るケース。

この場合、
7と、4つ先にある5、次の4つ先が9
同じように
6と、4つ先にある4、次の4つ先が1
10、4つ先が8その先はないので終わり
2と、4つ先にある3、その先はないので終わり
ということになる。

その後、理屈では、
7,5,9の場合、5だけ7の前に入れ替えることになる。

A[i] の適切な挿入位置が見つかるまで、
A[i] より大きい要素を後ろにずらしていくというところが
難しい。
要するに、グループの中で、4つ飛びに要素を取得して比較するということを
繰り返しやっているということ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0