2018年11月28日水曜日

シェルソートをわかりやすくまとめる

シェルソートについて、わかりやすくまとめたいと思います。

シェルソートとは

一定間隔(g)ごとに挿入ソートを行うことをシェルソートといいます。 最後に必ず、通常の挿入ソートを行いますが、
この時に、あらかた整列されていることが期待されます。

この一定間隔gの決め方ですが

g = 1,4,13,40,121・・・

つまりは、
$g_{n+1} = 3g_{n} + 1$の数列を用いると、
計算量が$O(N^{1.25})$になるようです。

また、上記のgを適応すると、2のべき乗の値($2^p = 1,2,4,...$)の場合は、ソート対象となる要素が少なくなるため、
効率化は見込めないようです。

シェルソートの工程を図解する

実際にシェルソートが行われる工程を図解してみます。

数列{4,8,9,1,10,6,2,5,3,7}に対して、 g{4,3,1}として、シェルソートをかけてみます。

ここで、選択対象数字を赤で、整列済みの数字を緑で表現したいと思います。

1.間隔を4に空けて挿入ソートをかけます。

4,8,9,1,10,6,2,5,3,7
3,8,9,1,4,6,2,5,10,7
3,8,9,1,4,6,2,5,10,7
3,6,9,1,4,7,2,5,10,8
3,6,9,1,4,7,2,5,10,8
3,6,2,1,4,7,9,5,10,8
3,6,2,1,4,7,9,5,10,8
3,6,2,1,4,7,9,5,10,8

2.間隔を3に空けて挿入ソートをかけます。

3,6,2,1,4,7,9,5,10,8
1,6,2,3,4,7,8,5,10,9
1,6,2,3,4,7,8,5,10,9
1,4,2,3,5,7,8,6,10,9
1,4,2,3,5,7,8,6,10,9
1,4,2,3,5,7,8,6,10,9

3.最後に間隔1(通常)に空けて挿入ソートをかけます。

1,4,2,3,5,7,8,6,10,9
1,2,3,4,5,6,7,8,9,10

0 件のコメント:

コメントを投稿