Я пытаюсь реализовать быструю сортировку в Java, и я изо всех сил пытаюсь реализовать это эффективно. Я считаю, что проблема в моих рекурсивных вызовах, но я не могу определить, как это исправить. Я использую сравнения, чтобы увидеть, сколько раз было сделано сравнение в надежде определить, где проблема. Единственное, о чем я могу думать, - это требовать условного выражения для моих рекурсивных операторов, потому что количество необходимых сравнений остается тем же, независимо от того, был ли введенный массив уже отсортирован или, по-видимому, рандомизирован.
public int quickSort(int[] arr, int left, int right) {
//left is lowest index
//right is highest index
int compares = 0;
//calls insertion sort once subsets get smaller than 7 elements
if (right - left < 6) {
compares += insertSort(arr, left, right);
return compares;
}
//calculate random pivot
int pivotIndex = randomInt(left, right);
int pivotValue = arr[pivotIndex];
//moves pivot value to rightmost index
int temp;
temp = arr[pivotIndex];
arr[pivotIndex] = arr[right];
arr[right] = temp;
int pivotFinal = left;
//determines how many values are lower than the pivot, swapping
//smaller values with larger values along the way
for (int i = left; i < right; i++) {
compares++;
if (arr[i] <= pivotValue) {
temp = arr[i];
arr[i] = arr[pivotFinal];
arr[pivotFinal] = temp;
pivotFinal++;
}
}
//moves pivot to final position so that quicksort is complete
temp = arr[pivotFinal];
arr[pivotFinal] = arr[right];
arr[right] = temp;
compares += quickSort(arr, left, pivotIndex - 1);
compares += quickSort(arr, pivotIndex + 1, right);
return compares;
}
public void main() {
QuickSort qs = new QuickSort();
int n = 60;
int[] array = qs.GenerateRandomSequence(n);
int compares = qs.quickSort(array);
}
При n, равном 60, для одной из последовательностей требуется более 4 миллионов сравнений, что намного, намного хуже, чем фактическое время выполнения в худшем случае.