gpt4 book ai didi

c++ - 使用 Hoare 分区方案的快速排序算法返回原始未排序列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:14:54 27 4
gpt4 key购买 nike

我尝试用 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;
}
}

调用Quicksort算法对列表{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 .这让我相信我正在尝试访问越界的东西。

最佳答案

算法的分区部分没有以正确的方式实现。特别是,left 可能会变得大于 right 并且这

if (left != right)
std::swap(list[left], list[right]);
// ^^^^^^^^^^

可以越界访问 vector 。

请看下面的片段:

int partition(std::vector<int> &list, int left, int right)
{
// I'm calculating the pivot here, instead of passing it to the function
int pivot = list[left + (right - left) / 2];
while (true)
{
while (list[left] < pivot)
left++;
while (list[right] > pivot)
right--;

// Stop when the pivot is reached
if (left >= right)
return right;

// Otherwise move the elements to the correct side
std::swap(list[left], list[right]);
}
}

void sort(std::vector<int> &list, int left, int right)
{
// Execute only if there are enough elements
if (left < right)
{
int pivot = partition(list, left, right);

// As NiVer noticed, you have to limit the range to [left, right]
sort(list, left, pivot - 1);
sort(list, pivot + 1, right);
}
}

可测试 HERE .

还可以考虑使用迭代器以更通用的方式实现这些功能。

关于c++ - 使用 Hoare 分区方案的快速排序算法返回原始未排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54881712/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com