これは何ソートって呼ぶのかな

先月から、アルゴリズムの勉強と C 言語の勉強を始めたはずなのですが、気づけば今月はほとんど何もしていないことに気づきました。 で、それらの勉強をそろそろ再開したいのですが、その前に、今回は、ちょっと思い出話を書き残してみたいと思います。

証券事務代行会社での非事務的アルバイト

学生の頃、ある証券事務代行の会社でアルバイトをしたことがあります。 その会社では、半期末 (毎年 3 月末と 9 月末) に近づくと、名義人の書き換えのため、大量の株券の束が届くようになるので、それらの仕分け作業のために短期的な学生アルバイトを雇っていたのでした。

無造作に箱に投げ込まれ作業場に届く株券の束には、通し番号が振ってあります。 それらを通し番号の順に並べ替えて、事務処理をおこなう人たち (こちらは主婦層中心のアルバイトでした) に配るというのが、わたしを含む男子学生アルバイトのおもな仕事でした。

通し番号は、正確には覚えていませんが、だいたい 2 桁の番号でした。 また、ひとつの箱に入っていた株券の束の中では、通し番号の重複はありませんでした。 そこで、以下では、仮に 0 から 99 までの通し番号が振られた 100 個の株券の束があるものと想定して、話をします。

従来、先輩たちがやっていた並べ替えの方法は、次のとおりでした。 まず、100 個の束を、10 個の山に分けます。 分けるルールは、10 の位の数が 0 の場合は 「0」 の山に、1 の場合には 「1」 の山に積んでいく、というものです。 10 個の山に分けたら、それぞれの山の中で、並べ替えをします。 すべて済んだら、10 個の山を順番に回収し、0 番から 99 番まで並べることができるようになります。

わたしは、それとは異なる方法を考えました。 まず、100 個の束を、10 個の山に分ける際、10 の位の数に応じて分けるのではなく、1 の位の数に注目して分けるのです。 すなわち、1 の位の数が 0 の場合は 「0」 の山に、1 の場合は 「1」 の山に、という具合にです。 で、10 個の束に分けたら、いったんそれらを 1 箇所にまとめます。 ここで重要なのは、「9」 の山にあった束が最初に来るようにし、「0」 の山にあった束が最後に来るようにすることです。 つづいて、今度は、10 の位の数に注目して、ふたたび 10 個の山に分けていきます。 そうすると、最初のうちは、1 の位の数が 9 である束だけが、各山の底辺に来ることになります。 そして、次は、1 の位の数が 8 である束が各山に積まれていきます。 こうすることで、最終的には、どの山も 1 の位の数を見ると上から下まで 0 から 9 まで並んだ状態になります。 あとは 10 個の山を、順番に回収することで、全体として 0 から 99 まで整列した状態を得ることができます。

従来、先輩たちがやっていた並べ替えの方法と違うのは、わたしの方法は、無我夢中で 10 個の山にどんどん積んでいくという作業を 2 回やればよいという単純さにあります。 先輩たちの方法だと、10 個の束を手元でせっせせっせと並べ替えるという作業を 10 回おこなう必要があります。

直感的には先輩たちの方法のほうがわかりやすいので、わたしの方法はちょっと理解していただけなかったのですが、唯一理解してくれた同志がいて、その人とわたしは、結果的には誰よりも早く並べ替えを済ませることができました。 蛇足ですが、その同志は、視力に障害のある方でしたが、非常に明るい性格で、当時は (現在も ?) 非常に内気で頑固だったわたしにいろいろ話しかけてくださったり、わたしが何をしようとしているのかに理解を示してくださったりして、わたしとしてはその会社でのアルバイト中に大変心の支えになった方でした。

わたしとしては、視力に難のある方でも短時間で並べ替えを完了させることのできる方法を考案したつもりで、また実際にそこそこの成果も上がり、ちょっと自画自賛してもいいよね、という気分でした。 アルバイト期間の終わりに近づいた頃には、先輩からも、「次のシーズンには、君たちは幹部だね」 と褒めていただきました。 幹部になれば、立派なユニフォームが貸与されるので、ひそかに喜んでいましたが、やがて株券の保管振り替え制度が本格化し、その作業自体が不要となり、わたしたちがそのアルバイトの現場で幹部になることはありませんでした。

まとめ

物理的な何かを人力でソートする場合、クイックソートマージソートを利用するという方法もあるのかもしれませんが、作業場 (作業用テーブル) の広さに限りがあると、そうもいかないんじゃないかと思います。 人力ソートには人力ソートなりの定番アルゴリズムというものがあってもいいんじゃないかと思いますが、そういうものはそもそもあるのでしょうか。 そういう観点のアルゴリズムの話題があったら、ちょっとおもしろそうだなと思います。