Я пытаюсь понять механизм быстрой сортировки, но до сих пор я не могу понять это. Согласно википедии, этапы:C++ QuickSort not clear
1. Выберите элемент, называемый стержнем, из списка.
2. Переупорядочьте список так, чтобы все элементы со значениями меньше, чем стержень прийти до поворота, в то время как все элементы со значениями больше, чем стержень пришел после него (равные значения могут идти в любом случае). После этого разбиения стержень находится в своем последнем положении. Это называется операцией раздела.
3. Рекурсивно применяйте вышеуказанные шаги к подэлементу элементов с меньшими значениями и отдельно подэлемент элементов с большими значениями.
И это код:
int partition(int arr[], int left, int right)
{
int i = left, j = right;
int tmp;
int pivot = arr[(left + right)/2];
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
}
return i;
}
void quickSort(int arr[], int left, int right) {
int index = partition(arr, left, right);
if (left < index - 1)
quickSort(arr, left, index - 1);
if (index < right)
quickSort(arr, index, right);
}
Все как-то мне ясно, кроме одного. Почему функция перегородки возвращает i
, а не j
?
Это может возвращать либо один в зависимости от того, к какой группе вы положили стержень в – 2013-03-12 19:45:55
, если я ставлю '' возврат J;. '' Вместо '' возвращения I, '', для массива ' '{3,2,4,1}' 'программа вылетает – Teo
@ Theo .: Это потому, что функция' quickSort', которую вы там там, ожидает, что 'partition' вернет индекс первого элемента второго раздела. Меняя его, чтобы ожидать, что индекс последнего элемента будет довольно тривиальным изменением. –