アプリ版:「スタンプのみでお礼する」機能のリリースについて

構造体の配列をqsortで昇順に並び替えるプログラムを作成しています。
対象は数値項目で、単純にNo順に並び替えるイメージです。

クイックソートは、配列の内容によって処理時間が変わると聞いたので、一番遅くなる場合の時間を調べたいのですが、どのような並びだと一番遅くなるのでしょうか?

A 回答 (5件)

「値が等差数列で、並べたい順番と真逆に並んでいる時」が最悪と言われています。



例えば
8、7、6、5、4、3、2、1

1、2、3、4、5、6、7、8
に並べ替える場合など。

但し、ライブラリのqsortは「要素数がある程度少なくなった場合、アルゴリズムをクイックソート以外の物に切り換える場合がある」ので、クイックソートの計算量を検証する場合は「ソートルーチンを自作」しないと、正確な数値は計れません。
    • good
    • 0

当然ですが, ひとえにクイックソートといっても「実際にどのようにピボットを決めているのか」がわからないと「どのような並びで最悪になるのか」はわかりません.


でも, いくらなんでも「列の最初 (または最後) をピボットにするクイックソート」は「しょぼい」と言われてもしかたがないと思う.
もちろん deterministic なクイックソートではどんな (O(1) の) ピボットの決め方をしてもそれに対応して「(O(n^2) かかる) 最悪の場合」は存在します. ですが, 列の端の要素をピボットにすると「昇順または降順にソートされた列」が最悪になるので普通はそんな風にしないと思います. 例えば「列の中央にあるデータ」とか「最初のデータ, 最後のデータと中央のデータの中央値」ってやればこれほど簡単ではないので, そのようなピボットの決め方の方が普通じゃないでしょうか.
    • good
    • 0

処理系を特定しなければどうしようもありません。



すでに回答が出ているように、qsortはクイックソートで実装されているとは限りません。スタックが小さい環境ではヒープソート等で実装するのがよいでしょうし、そうでない場合でも、イントロソートの方が普通は優れています。
どんなアルゴリズムでどのように実装されているかで、かなり変わるはずです。
    • good
    • 0

えぇと, そもそも「qsort がクイックソートをする」って決まってるわけじゃないですけど....


規格上は「ソートする」としか書いてないですし.
    • good
    • 0

クイックソートにも色々なアルゴリズムが有りますが


一般的には降順に並んでいるデータを昇順に並べ替えるのが一番時間がかかるとされています。
理由は最初に出てきたデータをピボット(グループ分割のための基準データ)にするためです。
降順だと最後まで「1:残り」にしか分割されません。
平均的には2分割の繰り返しだと「クイック」になるのですが。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!