C++中的快速排序

quick sort in C++

本文关键字:快速排序 C++      更新时间:2023-10-16

我正在实现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