見出し画像

『写経』の道から少し外れて道草をした

お疲れ様です。Y研究員です。『写経』でプログラミングを学ぶには、お手本から離れて違うものを作ってみると良いと書きました。今日は、教科書の『写経』は少しお休みして、ソートを深堀してみたいと思います。

先日、Shellsortを写経してから他のソートもあったなと思い、Wikipediaを開いたら40種類くらいあると分かりました。そこで一番簡単なバブルソートを書いてみました。こういうのが一発で書けると良いですが、境界条件を1つ間違えるバグを仕込んで、配列に入ってない数字が結果に表示されました。幸いプログラムを眺めることでバグを発見できたので、そのまま修正しました。

K研究員からは「学生時代に俺が考えた最強のソート」を共有してもらいました。Pythonで書いてきたので、Cで書き直してみました。K研究員から教えてもらったので勝手にk-sortと名付けましょう(クラスタリングのk-meansみたいですね)。しかし、最近のマシンは64bitなので、MINからMAXまで全探索すると一つの要素に対して2の64乗回も比較をしなければなりません。実際に動かしてみると反応が帰ってきません。。。

input = [100, 200, 5, -38, 89]
sorted = []
for i in range(INT_MIN, INT_MAX):
    for j in input:
        if i == j:
            sorted.append(i)

そこで改良型としてky-sortを書いてみました(K研究員のアイディアをY研究員が改良したという意味で)。実装は以下のとおりです。

void ky_sort(int v[], int vr[], int length)
{
    int max, min;
    max = min = v[0];

    for (int i = 0; i < length; i++)
    {
        if (v[i] < min)
            min = v[i];
        else if (v[i] > max)
            max = v[i];
   }

    int k = 0;
    for (int i = min; i <= max; i++)
    {
        for (int j = 0; j < length; j++)
        {
            if (i == v[j])
            {
                vr[k] = i;
                k++;
            }
        }
    }
}

これも結局、配列内要素の値域に依存するアルゴリズムなので、面白いながらあんまり賢くはありません。しかしこれが駄目かと言われると、上には上がいるので、もっと「すごい」アルゴリズムを紹介して今日は締めたいと思います。その名もボゴソート。簡単に書くとランダムに並べ替えて判定し続ければいつかはソートが完了するという、博打的なアルゴリズム?です。バカバカしいように聞こえますが、かなり理論の研究がされている面白いテーマと分かりました。

さて、今日はC言語の『写経』から脱線しました。しかし、しばらく『写経』をしているとアレコレ作ってみたくなるものです。その興味に任せてやってみると、お手本だけでは分からないことも発見できるので良いと思います。その例示として、もう一回くらいはソートで遊んでみたいと思いました。

写真は大昔のラズパイです。C言語を書いたりコンパイルはSSH接続をしてラズパイからやってます。今見たらRPi4は4GBでも新品価格が1万円を超えていてすごいことになってますね。。。

それではまた!

般若心経の写経とプログラムの『写経』に関する記事はこちらからどうぞ。


無料のプログラミングクラブCoderDojoを運営するにあたり寄付を受け付けています。お金は会場費・Wifiの費用・教科書に使用します。