Вам повезло: в последние месяцы кодирование kata было для реализации быстрой сортировки. Вот что я придумал:
/**
* Sorts the elements with indices i such that l <= i < r
*/
private static void qsort(int[] a, int left, int right) {
int l = left;
int r = right - 1;
if (l >= r) {
return;
}
int pivot = a[l];
l++;
for (;;) {
while (l <= r && a[l] <= pivot) l++;
while (a[r] > pivot && l < r) r--;
if (l < r) {
int t = a[l];
a[l] = a[r];
a[r] = t;
} else {
break;
}
}
l--;
a[left] = a[l];
a[l] = pivot;
qsort(a, left, l);
qsort(a, r, right);
}
Как вы можете видеть, алгоритм использует исходное местоположение сводной точки только для того, чтобы найти значение этой сводной точки и для ее свопинга к индексу между разделами.
Если мы не знаем, что стержень существует, мы просто обработали бы значения, равные значениям, похожим на сводку
Однако завершение больше не гарантируется: известно, что QuickSort завершается, потому что каждый шаг рекурсии использует работы на более коротком срезе массива, чем его вызывающая сторона, а срезы массива, как известно, короче, поскольку они не содержат элемент pivot. , Это больше не верно для вашего модифицированного алгоритма. В самом деле, легко увидеть, что завершение будет зависеть от вашей стратегии выбора значения разворота.