Каково значение моей переменной при вызове быстрой сортировки для правой части? - PullRequest
1 голос
/ 23 сентября 2019

Я изо всех сил пытаюсь понять конкретную часть в процессе реализации быстрой сортировки ниже.

В частности, когда я отсортировал левую часть сводки, я должен вызвать 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 после сортировки левой половины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...