Я пытался реализовать алгоритм быстрой сортировки с помощью схемы разбиения Hoare, но когда я запускаю его в тестовом списке {412, 123, 57, 12, 1, 5}
, а затем распечатываю, я получаю числа в исходном порядке.Может ли кто-нибудь помочь мне определить, что я делаю неправильно?Ниже моя реализация.
void Quicksort::sort(std::vector<int> &list)
{
sort(list, 0, list.size() - 1);
}
void Quicksort::sort(std::vector<int> &list, int left, int right)
{
if (left - right <= 1) return; // no need to partition a single element
int pivot = left + (right - left) / 2; // <=> (left+right)/2, but avoids overflow
int endIndex = partition(list, pivot, left, right);
sort(list, 0, endIndex - 1);
sort(list, endIndex + 1, list.size() - 1);
}
int Quicksort::partition(std::vector<int> &list, int pivot, int left, int right)
{
while (true)
{
while (list[left] < list[pivot])
left++;
while (list[right] > list[pivot])
right--;
if (left != right)
std::swap(list[left], list[right]);
else
return left;
}
}
Для вызова алгоритма быстрой сортировки в списке {412, 123, 57, 12, 1, 5}
Я использую следующий код:
std::vector<int> numbers = {412, 123, 57, 12, 1, 5};
Quicksort::sort(numbers);
for (int i = 0; i < numbers.size(); i++)
std::cout << numbers[i] << "\n";
Вывод на консоль
412
123
57
12
1
5
Редактировать
После исправления ошибки if (left - right <= 1)
, которая должна быть if (right - left <= 1)
, программа обнаружит ошибку Segmentation fault: 11
.Это заставляет меня поверить, что я пытаюсь получить доступ к чему-то, что находится за пределами.