QuickSorts (Single Pivot、3-way、および Dual Pivot) のパフォーマンスを大まかにベンチマークしようとしています。
質問 1 : 3 分割の実装で何かが足りないのではないかと心配しています。ランダムな入力 (1000 万) の数値に対して数回実行すると、単一のピボットのパフォーマンスが常に向上することがわかりました (ただし、1000 万の数値では約 100 ミリ秒の差があります)。
3 ウェイの全体的な目的は、重複キーでの 0 (n^2) パフォーマンスではないことを理解しています。これは、重複入力に対して実行すると非常に明白です。しかし、重複データを処理するために、わずかなペナルティが 3-way にかかるというのは本当ですか? それとも私の実装が悪いですか?
重複データ:
- Quick Sort Basic : 888 ミリ秒
- クイック ソート 3 ウェイ: 522 ミリ秒
- クイック ソート デュアル ピボット: 482 ミリ秒
ランダムデータ:
- クイックソート基本: 1677 ミリ秒
- クイックソート 3 ウェイ: 1717 ミリ秒
- クイック ソート デュアル ピボット: 1595 ミリ秒
質問2 :
デュアル ピボットの実装 (以下のリンク) は、重複を適切に処理しません。実行には 0(n^2) 時間がかかります。早送りする良い方法はありますか?ピボットが等しいかどうかを確認し、pivot2 と異なるまで、pivot1 をインクリメントできることがわかりました。これは公正な実装ですか?
else if (pivot1==pivot2){
while (pivot1==pivot2 && lowIndex<highIndex){
lowIndex++;
pivot1=input[lowIndex];
}
}
実装リンク:
ルートフォルダー: https://github.com/arunma/dsa/tree/master/src/basics/sorting/quick
QuickSort (単一ピボット) : https://github.com/arunma/dsa/blob/master/src/basics/sorting/quick/QuickSortBasic.java
QuickSort (3 ウェイ パーティション) : https://github.com/arunma/dsa/blob/master/src/basics/sorting/quick/QuickSort3Way.java
QuickSort (デュアル ピボット) : https://github.com/arunma/dsa/blob/master/src/basics/sorting/quick/QuickSortDualPivot.java
テストケース: https://github.com/arunma/dsa/blob/master/src/basics/sorting/quick/QuickSortTest.java