こんにちは、Karouです。今回は、ソートアルゴリズムの動きを音と映像でリアルタイムに体感できるWebアプリ「Sorting Cinema」を作った話をします。

きっかけは「ソートの動き、音にしたら面白くない?」

ソートアルゴリズムの可視化はYouTubeなどでもよく見かけます。バーがぐにゃぐにゃ動いて、最後にきれいに揃う——あれ、見ていて気持ちいいですよね。

でも、見るだけじゃもったいない。比較やスワップのたびに音が鳴ったら?アルゴリズムごとに違うリズムが生まれたら?そんな発想から「Sorting Cinema」の開発が始まりました。コンセプトは「Beat Grid Fusion」——ソートの確定的なロジックと音楽のライブパフォーマンスを融合させるというものです。

25種類のソートアルゴリズム

Sorting Cinemaには、5カテゴリ・25種類のソートアルゴリズムを搭載しています。

搭載アルゴリズム一覧

  • 比較ソート(11種):バブル、選択、挿入、マージ、クイック、ヒープ、シェル、カクテル、ノーム、コム、Timソート
  • 非比較ソート(3種):カウント、基数、バケットソート
  • 並列向け(2種):奇偶ソート、ビトニックソート
  • 独特な構造(2種):パンケーキソート、ストゥージソート
  • ジョークソート(3種):ボゴソート、スリープソート、スローソート

遅いアルゴリズム(ボゴソートなど)は要素数を自動制限する安全機構付き。ブラウザがフリーズする心配はありません。

3つのモード

🎬 シネマモード

メインのモードです。アルゴリズムを選んで再生すると、バーの動きに合わせて音が鳴ります。要素数(10〜100)、再生速度(11段階)、音階(ペンタトニック、メジャー、ブルース、琉球音階など8種類)を自由に組み合わせられます。

ステップ実行機能を使えば、1操作ずつ進めながら「今なにが起きているか」をリアルタイムの解説テキスト付きで追うことも可能。ドラッグ&ドロップで配列を手動で並べ替えてから実行することもできます。

🏁 レースモード

2〜4つのアルゴリズムを選んで、同じ配列を同時にソートさせるレース。並べて動かすと、アルゴリズムごとの「性格」の違いが一目瞭然です。クイックソートの大胆な分割、バブルソートの地道な交換——操作回数とともに順位が表示されます。

🧩 クイズモード

ソートの動きを見て「これは何ソート?」を当てるクイズ。4択で出題され、ソートが終わる前に回答することもできます。同じカテゴリのアルゴリズムが選択肢に並ぶので、見分ける力が鍛えられます。

音の仕組み — 3層のオーディオレイヤー

Tone.jsを使い、3つの音のレイヤーを重ねています。

  • メロディ:配列の値をペンタトニックなどの音階にマッピング。比較・スワップのたびに対応する音が鳴る。オクターブ3〜6の48音を使い、100要素の配列でも音が被らない
  • コード進行:バックグラウンドでメジャー/マイナーのトライアドが進行。ソートの進捗に応じてコードが変化する
  • ドラムビート:比較→ハイハット、スワップ→スネア、要素確定→キック。アルゴリズムの動きがそのままリズムパターンになる

クイックソートは激しいビートを刻み、挿入ソートは穏やかなメロディを奏でる。同じアプリなのに、アルゴリズムを変えるだけで全く違う「曲」が流れてくるのが面白いところです。

その他の機能

  • 4種のビジュアル:バー、サークル、カラーヒートマップ、スキャッターの4つの表示モード
  • URL共有:アルゴリズム・要素数・音階・速度などの設定をURLパラメータに含めて共有可能。Xへのシェアボタン付き
  • 多言語対応:日本語・英語の2言語に対応
  • 配列プリセット:ほぼ整列済み、逆順、山型、谷型、重複多数の5パターン

技術スタック

React 19 + Vite 8で構築し、Tone.jsでオーディオを制御。Firebase Hostingでデプロイしています。requestAnimationFrameループで60fpsの描画を維持しつつ、React.lazyによるコード分割でメインバンドルを275KBまで削減しました。

ソートアルゴリズムを「見る」だけでなく「聴く」ことで、アルゴリズムの振る舞いが直感的に理解できます。ぜひヘッドフォンをつけて体験してみてください。

→ Sorting Cinema を体験してみる

次の記事:2日間の爆速開発記録一覧