• ベストアンサー

バブルソートとクイックソート

まだソートについて勉強し始めたばかりですが バブルソートは対象の総数が増えるとそれに伴い比較回数は増加するのに対し クイックソートはそれほど増加しないのはなぜでしょうか?? 検索してみてもプログラムが書いてあってよくわからないので... 根本的なところなのでしょうがどなたか教えてください!

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

では「計算量」というキーワードも追加して検索してください。 また、計算量を表わすのに使われる「オーダー」「ランダウの漸近記法」についても調べてみてください。 おおざっぱに言うと まじめに比較すれば、 一つ目と残りn-1個の比較 2つ目とそれ以降のn-2個の比較 ... と、要素数nの二乗に比例した回数の比較必要です。これがバブルソートの計算量です。 これを、大きいもの方と小さい方の半分に分けてそれぞれを並び変えれば、 1つの並び換えが(n/2)の二乗= 1/4 * nの2乗 それが大と小の2回で * 2 合わせて 1/4 * nの2乗 * 2 = 1/2 * nの2乗 とバブルソートの半分になります。その半分のものを更に半分に...とやっていくと、最後には n * log2 n に比例する値になります。 これが、クイックソートの計算量です。(正確には平均ですが) 細かい点は省略しているので、最初に書いたような検索の結果や、「アルゴリズム」について詳しく書かれた専門書などを読んでください。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

念のためですが.... #2 ではピボットの選び方として「普通は、最初の値や最後の値が使われる」と書かれていますが, これは「アルゴリズムの説明」としてはあり得ても (まあ「アルゴリズムの説明」で最後の値を使うのはかなりひねくれていますが) 「普通に使うため」にはあり得ません. その理由はまさに #2 に書いてある通り「整列されているものに対して適用するとO(n^2)」となってしまうからです. 普通に使うなら「データ列の中央の値を使う」とか「最初と中央と最後のうち真ん中の値のものを使う」とかの選び方をするはずです. もっともどのような選び方においても「最悪のデータ列」というのは存在するので, 「ピボットの値をランダムに選ぶ」という投げやりな方法をすることもあります. なお, 本題に対する「大雑把な説明」としては「どちらも一定の条件が成り立つときに 2つのデータの位置を入れ替えるんだけど, どことどこを入れ替えているのかを考えてみる」のがよいかと.

回答No.2

クイックソートはいい具合にランダムにデータが並んでいるという最良の場合にのみO(n log n)になり、整列されているものに対して適用するとO(n^2)です。 クイックソートの手順は、ピボットと呼ばれるデータをまだ大小に分けられていない場所から適当に選び(普通は、最初の値や最後の値が使われる)、それよりも大きい値と小さい値に残りを分け、分けられた中でまた同じ操作を繰り返すというものであるのはご存知かと思います。こうすると、ピボットよりも大きいものと小さいものに一度分けたら、大きいグループの要素と小さいグループの要素を今後は比較しません。つまり、それだけ比較の回数が減ります。バブルソートだとこういうグループ分けが無いので、毎ターン最小値or最大値を残りのグループから探すのに対し、クイックソートでは1/2の領域を更に大小に分けるだけで済みます。n個の要素が毎回綺麗に1/2ずつに分けられていくと、log n回分けることになると思いますが、そのたびに中に入っている要素を整理するのでおおよそ1/2ずつに分けたラウンドで合計n-1回、1/4ずつに分けたラウンドで合計n-3回、...と各ラウンドでざっくり言ってn回の比較が必要になります。よって、O(n log n)です。 ...という説明でわかりましたでしょうか? 更にこの手の話を理解したい場合は、分割統治法について調べてみるとよいでしょう。分割統治法自体は、マキャベリの君主論にあるdivide et impera (分割して統治せよ) から来たと言われていますが。 同じく分割統治法のアルゴリズムでは、クイックソートよりはマージソートのほうがわかりやすいですね。クイックソートと違って毎回同じスピートで処理してくれる代わりに倍のメモリーが必要になりますが。

関連するQ&A

  • バブル・ソート、クイック・ソート

    N個(N=4,5,6)のデータが全て等しいデータ列(例えばN個の数字全部が1のとき)をバブルソートで並び替えたとき、データの交換回数は何回か。また、同じデータ列をクイックソートで並び替えたときはどうか。 という問題があるのですが、どう比較するのかがわかりません。詳しい方、説明よろしくお願いします。

  • クイックソート

    クイックソートの平均入れ替え回数っていくつになりますか? 全体の比較回数はnlognでしたっけ?

  • ソートアルゴリズム(選択法とバブルソート)の交換回数

    バブルソートと選択法について、交換回数がわかりません。 比較回数については、ネットで検索したり、本に載っているので分かりやすいのですが、交換回数があまり載っていなく…。 選択法の交換回数の最大値は、n-1でしょうか? バブルソートの交換回数の最大値は、nでしょうか? 交換回数については、選択法のほうがバブルソートより少なくてすむそうですが、上の答えでいいのかわかりません。 どなたか教えてください。お願いしますm(_ _)m

  • クイックソートのアルゴリズムについて

    (1)クイックソートが使われるのは実際にはどのような場面なのでしょうか?メインメモリで使われていると聞きましたが‥ (2)クイックソートが一番早いと聞きましたがコームソートやバブルソートなどは使われないのでしょうか? (3)マージソートはどのような局面で使われるのでしょうか?

  • クイックソートで並べ替え

    友人から情報処理の質問を受けました。ですが、私では良く分からなかったので質問します。 2,4,8,1,6,5,2,7,3,7の整数をクイックソートで並べ替えよ。 また、比較回数を示せ(軸要素は先頭の2要素のうち大きいほうとせよ)。 よろしくお願いします。

  • シェルソート,クイックソート

    シェルソートは比較数が小さいとクイックソートよりも早いですが,なぜでしょうか?

  • それぞれのソート方法の特徴の違いについて

    ソートを勉強しているのですが、 ヒープソートや、クイックソートなど効率の良いやり方と、 バブルソートのように、そうでないものがあるらしいことを 知ったのですが、最強のアルゴリズムは存在するのですか? それとも、ソート対象の状況によって、有効なアルゴリズムが違ってくるのですか? もし違うとしたら、どのように違うのでしょうか。

  • C言語、ソートの効率を考える問題について

    繰り返しソートとバブルソート、改良バブルソートの中でどれが一番効率的であるかを理論的な比較回数やプログラムの量、使用するメモリの量から考えたいんですけどわかりません。教えてください。

  • modified bubble sort

     ソーティングについて教えてください.  ソーティングの手法に,バブルソートというものがあります(隣接するふたつを入れ替える).このソーティングでは,最大交換回数は要素数が n のとき, n(n-1)/2 となります.  隣接する要素の交換に加え,先頭と最後の要素の入れ替えも可能だとすると(イメージとしては,サイクリックなバブルソートです),最大交換回数は n^2/4 となるそうです.  この n^2/4 になる,という理由が分かりません(普通のバブルソートが n(n-1)/2 になるのは理解できます).どなたかご教授頂ければと思います.

  • クイックソート

    N個のデータを降順に並び替えるプログラムをクイックソートで書きたいのですがよく分かりません。アルゴリズムの部分をどなたか教えてください。できれば詳しい説明もお願いします。