クイックソートプログラム

クイックソートプログラム

 前ページの説明をプログラムにしてみたものが図2のquicksortです。一見わかりづらいかもしれませんが、前述の説明をそのまま表現したものです。少し説明しましょう。

 (1)は説明では「ある数値」と呼びましたが、ここでは $pivot としています。軸足のことですね。今は説明のとおりに、左端の数値をピボットにします。

 (2)、(3)が「視点」です。それぞれ、左端と右端から中央に向かって動いていきます。

 (4)、(5)が視点の移動です。ピボットよりも小さいものがある間は左側の視点は動かし(4)、ピボットよりも大きいものがある間は右の視点を動かします(5)。視点が止まるのは、左側ではピボットに等しいか大きいものが現れたときです。右側ではピボットに等しいか小さいものが現れたときです。

 (6)もし視点がぶつかるか交差すれば区間の分割と入れ替えは終わりなのでおしまいになります。

 (7)視点の移動が止まったところで(視点の交差がない場合)、それぞれの視点の位置にある数値を入れ替えます。ここでは前回も出てきたswap関数を使います。

 このqsort関数を使うためには少しおぜん立てが必要です。引数に配列と、ソートしたい区間のインデックスを渡す必要があるからです。テスト用のプログラムも併せて示します(図2のプログラム全体)。

クイックソート分析

 さて、前回示したものよりはずっと複雑怪奇なプログラムになりました。しかし、その名の示す通り、この方法はとても速いのです。バブルソートでは平均計算回数は n^2(nの2乗)に比例すると説明しましたが、このquicksortは平均でn*log(n)に比例することがわかっています。「平均で」と言ったのは、区間の分割のしかたがまずいときは、やはりnの2乗に比例します。

 「区間の分割のしかたがまずい」というのは、区間がきれいに半分に分かれれば良いのですが、ピボットの数値の選び方が悪ければ、左側は1個だけで、残りが全部右側というようになるかもしれないということです。そのような最悪の場合が続くと、1回の分割で1個の入れ替えしかできず、結局n回繰り返すことになります。

 区間の分割をできるだけ左右同じになるようにするためには、ピボットの数値として、配列に現れる数値の平均値(中央値)を取るのがベストということになります。が、この平均値を計算するための労力も無視できませんから、一般には、配列に現れる3個程度の数値の平均値を使うか、配列の真ん中に位置する数値を使うなどの便宜的な方法を採用します。

 今回の説明で使った方法は配列の左端の数値を使うというものでしたが、今回はまずまずの計算回数だったと言えるでしょう。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30