C++中的快速排序
quick sort in C++
我正在实现Cormen‘s algorithm book(CLRS)中的快速排序算法,但它总是提示"偏移超出范围",我不知道如何修复它。这是我的密码。
template<typename Iterator>
void quick_sort(Iterator first, Iterator last)
{
if (last - first > 1)
{
auto pivot = partition(first, last);
quick_sort(first, pivot);
quick_sort(pivot + 1, last);
}
}
template<typename Iterator>
Iterator partition(Iterator first, Iterator last)
{
auto pivot = last - 1;
auto less_end = first - 1;
for (auto iter = first; iter != pivot; ++iter)
{
if (*iter <= *pivot)
{
std::swap(*++less_end, *iter);
}
}
std::swap(*(less_end + 1), *pivot);
return less_end + 1;
}
提前感谢!
当在partition()
中,first
等于底层序列的begin()
时,则:
auto less_end = first - 1;
变成未定义的行为。
这可能是你的问题。如果没有,请使用调试器一次遍历代码一行,直到遇到错误,并使用调试器找出问题的位置和原因。这就是调试器的作用。
正如Sam Varshavchik在回答中指出的那样,从第一名开始就是问题所在。最简单的解决方案:只需将整个事情移动一个,即从first
开始,后置而非预增量,依此类推…
template<typename Iterator>
Iterator partition(Iterator first, Iterator last)
{
auto pivot = last - 1;
auto less_end = first;
for (auto iter = first; iter != pivot; ++iter)
{
if (*iter <= *pivot)
{
std::swap(*less_end++, *iter);
}
}
std::swap(*(less_end), *pivot);
return less_end;
}
参见http://rextester.com/JCDUL96865
相关文章:
- 如何修复我的快速排序实现?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 在 MIPS 中快速排序
- 不正确的比较和交换计数器输出用于快速排序功能
- 使用 std::vector C++快速排序,EXC_BAD_ACCESS代码 2
- 使用快速排序对 C++ 中的可视化工具错误进行排序
- 快速排序 - 三个中位数枢轴选择 - 某些元素顺序不正确
- 并行快速排序分区中的隔离错误
- 实现 3 路分区以实现快速排序
- 为什么这个快速排序实现给出了一个奇怪的输出
- 我的快速排序在对预排序的项目进行排序时失败,如何改进?
- 快速排序不适用于大型数组
- 快速排序;分段错误,但找不到位置?
- 快速排序函数在快速排序算法中如何工作?
- 3路随机快速排序分区功能
- 在最坏的情况下试验快速排序.它运行良好,但在最坏的情况下发生未知错误.我想
- 当给出预先排序的输入时,为什么我的快速排序实现很慢
- 我想要一个改变数组快速排序的2个数字的函数
- C++一个具有 2 个参数(___ _____,整数长度)的函数中的快速排序
- 迭代快速排序方法的分区算法问题