Javaで効率的なソートアルゴリズムを実装しようとしました。このような理由から、私はまた、クイックソートを実装し、次のコードを使用します。Javaクイックソート二次ランタイム動作
public class Sorting {
private static Random prng;
private static Random getPrng() {
if (prng == null) {
prng = new Random();
}
return prng;
}
public static void sort(int[] array) {
sortInternal(array, 0, array.length - 1);
}
public static void sortInternal(int[] array, int start, int end) {
if (end - start < 50) {
insertionSortInternal(array, start, end);
} else {
quickSortInternal(array, start, end);
}
}
private static void insertionSortInternal(int[] array, int start, int end) {
for (int i=start; i<end - 1; ++i) {
for (int ptr=i; ptr>0 && array[ptr - 1] < array[ptr]; ptr--) {
ArrayUtilities.swap(array, ptr, ptr - 1);
}
}
}
private static void quickSortInternal(int[] array, int start, int end) {
int pivotPos = getPrng().nextInt(end - start);
int pivot = array[start + pivotPos];
ArrayUtilities.swap(array, start + pivotPos, end - 1);
int left = start;
int right = end - 2;
while (left < right) {
while (array[left] <= pivot && left < right) {
++left;
}
if (left == right) break;
while (array[right] >= pivot && left < right) {
right--;
}
if (left == right) break;
ArrayUtilities.swap(array, left, right);
}
ArrayUtilities.swap(array, left, end - 1);
sortInternal(array, start, left);
sortInternal(array, left + 1, end);
}
}
ArrayUtilities.swap
だけで、アレイ内の与えられた二つの要素を交換します。このコードから、私はO(n log(n))
実行時の動作を期待しています。
10000要素:32ms
20000要素:128ms
30000の要素:試験は、それぞれの場合に100回を実行296ms
しかし、ソートする配列のいくつかの異なる長さは、以下の結果を与えました次に、実行時間の算術平均を計算した。しかし、予想される動作とは対照的に、ランタイムはO(n^2)
です。私のアルゴリズムに何が問題なのですか?
クイックソートには、「O(n lg n)」**の最高のケース**のパフォーマンスがありますが、「最悪のケース**のパフォーマンス」(https:// en .wikipedia.org/wiki/Quicksort)。ベンチマークで最高のケースパフォーマンスが期待されるのはなぜですか? (もちろん、あなたはJMHでベンチマークをしていますが、手ではなく、数値は意味がありません)インスピレーションのための –
http://algs4.cs.princeton.edu/23quicksort/とhttp://algs4.cs .princeton.edu/lectures/23Quicksort.pdfおよびhttps://github.com/edermag/algorithms.princeton/blob/master/java/QuickSort.java –
入力配列の作成方法は?あなたのクイックソートが重複のためのインテリジェントな処理を持たないように見えるので、入力に重複要素がたくさんあると、パフォーマンスはO(n^2)に低下します。 – user2357112