web-dev-qa-db-ja.com

クイックソートと気にしないでください?

特に「標準」(非HPC)アプリケーションを作成する場合、どのソートアルゴリズムを選択するかを検討しますか、それともクイックソート(ほとんどのライブラリが単にソートと呼ぶもの)で解決しますか?特定の状況ではある程度は有益かもしれませんが、一方で、適切な最適化には、問題を分析してベンチマークを作成するためにある程度の時間が必要です。

9
mbq

一般に、よりエキゾチックなことをする特別な必要がない限り、デフォルトの方法を使用すると、すべてがずっと読みやすく、理解しやすくなります。

パフォーマンスの問題が発生した場合(または場合によっては強く疑われる場合)、複雑さを増す時期です。

一方、ソートする必要のある種類のオブジェクトのソートが組み込まれていないほど低い言語を使用している場合は、すべてのベースをカバーする1つまたは2つを選択して、それらを実装してみてください。

12
Bill

提供されたライブラリルーチンを常に呼び出します。ただし、そうしない非常に非常に正当な理由がない限り(そして、documentなぜそうなるのか)。

これは、ソートアルゴリズムを完全に正しくすることが難しいためです。 Javaクイックソートには非常に大きなデータセットがあり、Sunによって識別、修正、顧客に配信されたため、その必要はありませんでした。

また、Java 7のデフォルトのソートは、より新しい、より良いソートにアップグレードされました。これも無料です。

デフォルトのソートがおそらくでは不十分でない限り、それを使い続けてください。

6
user1249

ある会議で、これについての素敵な話を聞いたことがあります。

マイクロソフトでは、誰かがVB app(c。VB 3)を書いていて、たくさんの値があり、それらが欲しいと言って、たくさんの人にメールを送りました。コンボボックスに順番に表示されるようにするには、どのように対処すればよいですか。

誰もが古いコンピュータサイエンスの教科書を探して飛び込み、非常に効率的なルーチンを調べてVisual Basicに移植し、彼に郵送しました。ある人は、「コンボボックスにいくつの値がありますか?」とメールで返信しました。

「約50」と返事が来ました。

「sortedプロパティをTRUEに設定するだけです」。

99.9999%のインスタンスでは、ライブラリ、コントロール、またはSQL選択を使用して並べ替えを行うのが最適です。これは、ライブラリルーチンと作成するものとのパフォーマンスの違いがごくわずかであり、労力とメンテナンスのオーバーヘッドが結果を大幅に上回るためです。

3
Jon Hopkins

これは、時期尚早の最適化についての古典的な引用を引き出す時です。ほとんどの場合、それは本当に問題ではありません。最近のCPUの速度では、ほとんどのデータセットをバブルソートすることができますが、あまり気付かないでしょう。しかし、非常に大きなデータセットを並べ替えていて、並べ替えのパフォーマンスが問題になり始めた場合は、他のオプションを必ず検討する必要があります。

1
Mason Wheeler

それは明らかにビットとタイムスライスには関係ありませんが。マージソートはクイックソートよりも書きやすく、理解しやすいと思います。したがって、独自のソートアルゴリズムを作成する場合は、それを使用します。

0
Peter Turner

少なくとも有能に書かれたライブラリでは、組み込みのsortが単なるクイックソートではなく イントロソート として実装されることを期待しています。違いがそれほど重要になることはめったにありませんが、Introsortは、Quicksortの最悪の場合のパフォーマンスの低下を排除し、より一般的なケースへの影響を最小限に抑えます。

しかし、あなたの質問に答えるには:はい-それはあなたが通常始めるべきものであり、それが問題であることを示すプロファイラーの結果が得られるまで/そうでない限り、それはそこに留まるべきです。

0
Jerry Coffin