【发布时间】:2019-07-19 18:32:19
【问题描述】:
我尝试使用 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 (right - left <= 1) 的错误if (left - right <= 1) 后,程序遇到错误Segmentation fault: 11。这让我相信我正在尝试访问超出范围的内容。
【问题讨论】:
-
请将其设为minimal reproducible example。看起来你只需要添加几行就可以了,这对你来说很容易,但对我们来说还有很多缺失的部分
-
您确定
while (list[left] < list[pivot]) left++;不会越界吗? -
@user463035818 我现在添加了有关如何调用我的快速排序实现以及我得到的确切输出以使问题最小化、完整和可验证的信息。
-
我不认为
while (list[left] < list[pivot]) left++;会越界。如果是这样,我应该得到一个错误,不是吗? -
if (left - right <= 1)right不是大于left吗?
标签: c++ algorithm sorting quicksort