Я реализовал классический алгоритм разбиения Hoare для Quicksort. Он работает с любым списком уникальных номеров [3, 5, 231, 43]. Единственная проблема - когда у меня есть список с дубликатами [1, 57, 1, 34]. Если я получу повторяющиеся значения, я ввожу бесконечный цикл.Quicksort - разбиение Hoare с повторяющимися значениями
private void quicksort(int[]a, int lo, int hi) {
if (lo < hi) {
int q = hoare_partition(a, lo, hi);
quicksort(a, lo, q - 1);
quicksort(a, q + 1, hi);
}
}
private int hoare_partition(int[] a, int lo, int hi) {
int pivot = a[hi];
int i = lo;
int j = hi;
while (true) {
while (a[i] < pivot) i++;
while (a[j] > pivot) j--;
if (i < j) swap(a, i, j);
else return j;
}
}
Возможно ли, что реализация Хоара неверна и не может справиться с дубликатами?
Я знаю, что это было задано много раз (и я попробовал их все), но мне трудно понять решение этой реализации.
'в то время как (а [J]> = ось)' должна помочь. – user58697
Я пробовал, но я получаю java.lang.StackOverflowError, когда он 'while (a [j]> = pivot)'. –
'получение [StackOverflowError]' (помните _where_, вы обсуждаете это?) Запишитесь в самый большой раздел, итерации для других/не меньших. – greybeard