Я рассматривал функцию разбиения в книге "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
Вот как у меня получилось разделение по шагам
слева = 3, справа = 6. Поменять местами.
1 2 3 3 5 6 4
слева = 4, справа = 4. Выход
Однако массив, который у меня получился:
1 2 3 3 5 6 4
Не разбивается вокруг 4. Я неправильно выполнил шаги или алгоритм неверен? Я дважды проверил свое воспроизведение алгоритма и скопировал его правильно.
Кроме того, я не уверен, почему раздел возвращается влево, возвращает ли он стержень?
Я понимаю реализацию разделения и быстрой сортировки в Википедии, но я пытаюсь понять, что здесь происходит.