初心者がpython3とpygameでソートアルゴリズムを可視化してみる【シェルソート】

挿入ソートを改良したシェルソートをPythonで実装し、Pygameで可視化。刻み幅ごとにデータを整列し、全体が徐々に昇順へ近づいていく過程を確認します。

Share
初心者がpython3とpygameでソートアルゴリズムを可視化してみる【シェルソート】

シェルソート

前回に引き続いて調子に乗って別のソートアルゴリズムも試してみました。
まぁありがちですが。。。
あちこち見れば書いてますが、シェルソートは挿入ソートを改良したものです。
挿入ソートは、整列済みに近いデータ列に対しては、割と早い特徴があります。

最悪に近いケース

https://youtu.be/jSbfxJ5lqcs

最善に近いケース

https://youtu.be/8YHwsRLdueI

原理を考えれば、そりゃそうですが、かなり違いますね。
なので、この最善に近いケースにデータを近づけながら挿入ソートしたら早くなるんじゃね?
って言うのが、シェルソートの基本的なアイデアです。

アルゴリズム

データをある刻み幅hでグループ分けします。
例えば、

v = [ 3, 7, 1, 4, 10, 2, 8, 9, 5, 6 ]

を h=4 で分割すると、

v1 = [ 3, 10, 5 ]
v2 = [ 7, 2, 6 ]
v3 = [ 1, 8 ]
v4 = [ 4, 9 ]

のグループに分けられます。
これをそれぞれ、ソートして元の順番でつなぎ合わせます。

①ソート

v1 = [ 3, 5, 10 ]
v2 = [ 2, 6, 7 ]
v3 = [ 1, 8 ]
v4 = [ 4, 9 ]

②繋ぎなおし

v = [ 3, 2, 1, 4, 5, 6, 8, 9, 10, 7]

なんとなく、昇順に近い並びで並んでいるのがわかります。
次は、刻み幅を h = 2 として同じことを行うと、もう少し完全な昇順に近づきます。

最後に、通常の挿入ソートを行う。という手順です。
python的には、以下のように書いてみました。
(初心者ですので、効率は悪いと思います。)

Gistのソースコードを直接開く

結果

データの比較、並び替えの処理のみ記録してゆき、アニメーションにしてみました。
初めはランダムだったデータがだんだん昇順に近づいていくのがわかると思います。

https://youtu.be/4LnMiNi9ZRQ

最後は、気持ちいい速さで整列されますね。

所感

シェルソートを実装して可視化してみました。

可視化の部分は、汚すぎてお見せできないので、後回しに(-_-;)
Shellソートの名前の由来は、Donald L. Shellが、1959年に発表したアルゴリズムであることに由来しているそうです。
アルゴリズムやソートについて、なにか突っ込みやコメントありましたら、気軽にお願いします。
さて、次は何やってみようかな?
へだば、まだね!

Read more

どうしてWindowsはCドライブから始まるの? AとBはどこへ行った?

どうしてWindowsはCドライブから始まるの? AとBはどこへ行った?

どうしてWindowsはCドライブから始まるの? AとBはどこへ行った? Windowsを使っていると、システムが入っているドライブってだいたい C: ですよね。 でも、よく考えると変じゃないですか? アルファベットなら普通はAから始まりそうなのに、なんでいきなりCなの? じゃあ、 A: B: はどこに行ったんだよ、って話です。 これ、別にCに何か特別な意味があるわけじゃありません。 昔、AとBを先に使っちゃったから、その次がCになった。 だいたいそれだけの話です。 そもそも「Cドライブ」ってWindows系の文化 まず、C: とか D: とかいう呼び方は、今だとWindowsでおなじみのものです。 LinuxやmacOSでは、基本的にこんな呼び方はしません。 Linuxなんかだと、 / ├─ home ├─ usr ├─ var └─ ... みたいに / を一番上にして、ディスクもそのディレクトリ構造の中にくっつけて使います。 じゃあWindowsの C: D: E: はどこから来たのか。 Windowsより前の MS-DOS です。 ……

DirectXTK講座 第2回:Direct3D 11のテンプレート導入からウィンドウを表示まで

DirectXTK講座 第2回:Direct3D 11のテンプレート導入からウィンドウを表示まで

DirectXTK講座 第2回:Direct3D 11のテンプレートを導入してウィンドウを表示しよう 今回は、DirectXTKを使ったプログラムを作る土台として、Direct3D 11のプロジェクトテンプレートをVisual Studioに導入し、実際にウィンドウが表示されるところまで確認してみよう! 使用するのは、Chuck Walbourn氏が公開している directx-vs-templates を使います。個人のリポジトリですが、MS公式からもリンクされており、ほぼ公式です。テンプレートを使うことで、あらかじめWindow1枚ぐらいペロッと出すところまでを作ってくれます。 そのために、テンプレートを自分の開発環境にインストールする必要があります。VS(VisualStudio)までは前回まででインストールできていると思うので、それにテンプレートを追加するって感じ。 1.Direct3D用テンプレートを入手する まず、ブラウザ(なんでもいいよ)で次のGitHubリポジトリを開きます。 directx-vs-templates - GitHub リポジトリを開いたら