私のマシンの C ライブラリはqsort
、heapsort
、 、および を提供し、 man ページmergesort
で次のように述べています。
および関数はqsort()
、qsort_r()
パーティション交換ソートの変形である CAR Hoare の「クイックソート」アルゴリズムの実装です。特に、DE Knuth のAlgorithm Qを参照してください。クイックソートにはO(n lg n)平均時間がかかります。この実装では、中央値選択を使用して、O(n 2 )の最悪の動作を回避します。
このheapsort()
関数は、選択ソートの変形である JWJ William の「ヒープソート」アルゴリズムの実装です。特に、DE Knuth のアルゴリズム Hを参照してください。ヒープソートには、最悪のケースでO(n lg n)の時間がかかります。唯一の利点qsort()
は、追加のメモリをほとんど使用しないことです。whileqsort()
はメモリを割り当てませんが、再帰を使用して実装されます。
この関数には sizeバイトmergesort()
の追加メモリが必要です。nel * width
スペースが限られている場合にのみ使用してください。このmergesort()
関数は、既存の順序を持つデータ用に最適化されています。最悪の場合の時間はO(n lg n)です。その最良のケースはO(n)です。
通常、qsort()
は よりも速く、 は よりもmergesort()
高速ですheapsort()
。メモリの可用性とデータ内の既存の順序により、これが正しくない場合があります。
実装の具体的な詳細を確認したい場合は、オープン ソースの C ライブラリがたくさんあります。
「システム X がアルゴリズム Y を選択した理由」に関しては、意味のある答えを出すのはかなり難しい質問です。ドキュメントで理論的根拠を見つけることができなかった場合は、設計者に直接尋ねる必要があります。