いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

クイックソートとは何か

 データを大小順に並べ替える作業、ソートはデータ処理の様々な場面で使われ、アルゴリズム(算法。明確な手順)はたくさんあります。バブルソート基本選択法ヒープソートクイックソート、……。バブルソートなどはロジックは分かりやすいけれど効率が悪くて有名です。今回は(状況によりますが)最速と言われるクイックソートについて書きましょう。

 その前に……Excelにも、データベースにもソートの機能は搭載されていますが、そもそもどんなときに使うのでしょうか。例えば教員が成績をつけるときなどです。よくあるのは(中間試験)+(期末試験)を計算しておき、大小順に並べ替えて上から順に適当な人数ごとに10、9、8、……とやる方法です。成績の心配な子をリストアップするとか、上位10名を廊下に貼り出すとか、使い道はたくさんあるでしょう。

 さて、クイックソートです。扱うデータは

[5,2,1,4,6,4,8,9,6,4]

の10個としておきます。これらを小さいものから順に並べ直すのです。ロジック自体は単純です。まず先頭の5を基準にして、10個を次のように2グループに分けます。5未満のデータと、5以上のデータに分けるのです。

[5,2,1,4,6,4,8,9,6,4] → [2,1,4,4,4],    5,   [6,8,9,6]

第1グループ、基準の5、第2グループに分けました。同じ作業を第1グループ、第2グループに対して行います。まず第1グループの先頭の2を基準にして次のようにまたグループ分けするのです。

[2,1,4,4,4] → [1],  2,  [4,4,4]

そして第2グループも同じように

[6,8,9,6] → [ ] , 6, [8,9,6]

とするのです。このようにグループ分けの際、空のグループが現れることもあります。ここまでで最初のデータのセットは

[5,2,1,4,6,4,8,9,6,4] → [1], 2, [4,4,4], 5, [ ], 6, [8,9,6]

と並べ替えられました。まだデータ数が2個以上のグループが残っていますから、それに対して同じ作業を繰り返せばよいのです。

(↓ 以下、分かりづらければ★★★まで飛ばしてください)

 この方法には再帰的な処理が含まれており、初めてだとプログラミングするときに少し考えてしまうかも知れません。つまり……手順「qsort」を実行するとは、データの列の先頭を基準にして2グループに分け、それぞれで手順「qsort」を実行して結果をくっつけることである、というプログラムになるのです。★★★ 

 大学の情報処理の授業で、大きなコンピュータを使わせてくれました。と言ってもTSS(タイムシェアリングシステム)で、実際に相手にしていたのは端末ですが。言語はFORTRAN。今の流行りの言語に比べて分かりづらかった……(細かいことにうるさい!!)。機械の並んだ部屋では飲み食いはできないし、ぼくは座布団派(?)なので落ち着かず、「数学専攻でよかった……」と思いました。課題で「何かプログラムを書きなさい」みたいなのがあり、ぼくはバブルソートを書きました。ソートは初めてだったので珍しく、「おお、こういう世界もあったのか」と思いました。そのうちプログラミングの本なども読み、ソートにもいろいろある、と知ることになります。

 当時は何も分かっておらず、好きな勉強をできる!と希望に燃えていました。今もそういう感じかも知れませんが、懐かしいです。