Я попытался реализовать эффективный алгоритм сортировки в Java. По этой причине, я также осуществил быструю сортировку и использовать следующий код:Квадратичное поведение во время выполнения Java Quicksort
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 элементов: 32 мс
20000 элементов: 128мс
30000 элементов: 296ms
тест побежал в 100 раз, в каждом случае , а затем вычислялось среднее арифметическое времени работы. Но ясно, что в отличие от ожидаемого поведения время выполнения составляет O(n^2)
. Что случилось с моим алгоритмом?
Быстрая сортировка, конечно, имеет 'O (n lg n)' ** наилучший случай ** производительность, но также имеет ['O (n^2)' ** наихудший случай ** производительность] (https: // en .wikipedia.org/вики/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 –
Как вы заполняете свой входной массив? Похоже, что ваш quicksort не имеет разумной обработки дубликатов, поэтому, если на входе много повторяющихся элементов, производительность ухудшится до O (n^2). – user2357112