Я изо всех сил пытаюсь понять конкретную часть в процессе реализации быстрой сортировки ниже.
В частности, когда я отсортировал левую часть сводки, я должен вызвать sort(..)
для правойполовина с аргументами от j + 1 до hi.
Разве мои j не модифицируются функцией разбиения, когда я использовал ее для сортировки левой половины?
Таким образом j + 1 на самом деле не справа от оси?Я думаю, это больше вопрос понимания потока программ.
Итак, что такое j , когда я звоню sort(a, j+1, hi)
?Извините, если это глупый вопрос
// sort in ascending order
public static void sort(Comparable[] a) {
sort(a, 0, a.length - 1);
}
private static void sort(Comparable[] a, int lo, int hi) {
if (hi <= lo) {
return;
}
int j = partition(a, lo, hi);
sort(a, lo, j-1); // Sort left part a[lo .. j-1].
sort(a, j+1, hi); // <---- issue understanding here
}
private static int partition(Comparable[] a, int lo, int hi) {
// Partition into a[lo..i-1], a[i], a[i+1..hi].
int i = lo, j = hi+1; // left and right scan indices
Comparable v = a[lo]; // partitioning item
while (true)
{ // Scan right, scan left, check for scan complete, and exchange.
while (less(a[++i], v)) if (i == hi) break;
while (less(v, a[--j])) if (j == lo) break;
if (i >= j) break;
exch(a, i, j);
}
exch(a, lo, j); // Put v = a[j] into position
return j; // with a[lo..j-1] <= a[j] <= a[j+1..hi].
}
При сортировке [7, 5, 1, 3, 9, 8] я выбираю пивот, равный a[0]=7
.Сортировка левой половины, я получаю [1,3,5,7,9,8], а теперь остается назвать своим родом за правую половину поворота (7).Вызов должен выглядеть как sort(a, 3+1, 5)
, но я получаю, что он выглядит как sort(a, 1+1, 5)
, потому что мой j был 1 после сортировки левой половины.