我正在使用Cormen的算法书(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;
}
提前致谢!
答案 0 :(得分:1)
当您的partition()
,first
等于基础序列的begin()
时,则:
auto less_end = first - 1;
成为未定义的行为。
这可能是你的问题。如果没有,请使用调试器一次一行地执行代码,直到遇到错误,然后使用调试器找出问题的起因和原因。这就是调试器的用途。
答案 1 :(得分:0)
正如Sam Varshavchik已经在his answer指出的那样,从第一个开始就是问题所在。最简单的解决方案:只需将整个事物移动一个,即从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;
}