Правилен ли этот алгоритм разбиения?

Я рассматривал функцию разбиения в книге "Cracking the Coding Interview" (5e, стр. 119 ). Я скопировал это ниже:

int partition(int arr[], int left, int right){
    int pivot = arr[(left + right) /2 ]; // Pick pivot point
    while (left <= right) {
        // Find element on left that should be on right
        while (arr[left] < pivot) left++;
        // Find the element on right that should be on left
        while (arr[right] > pivot) right--;
        // Swap elements, and move left and right indicies
        if (left <= right) {
            swap(arr, left, right); // swaps elements
            left++;
            right--;
        }
    }
    return left;
}

Учитывая этот массив:

1 2 3 4 5 6 3

Вот как у меня получилось разделение по шагам

  1. 4 — это опорное значение. слева = 0, справа = 6
  2. слева = 3, справа = 6. Поменять местами.

    1 2 3 3 5 6 4

  3. слева = 4, справа = 4. Выход

Однако массив, который у меня получился:

1 2 3 3 5 6 4

Не разбивается вокруг 4. Я неправильно выполнил шаги или алгоритм неверен? Я дважды проверил свое воспроизведение алгоритма и скопировал его правильно.

Кроме того, я не уверен, почему раздел возвращается влево, возвращает ли он стержень?

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

8
задан phs 23 July 2012 в 04:57
поделиться