std :: partition segfault问题

时间:2018-10-14 22:01:23

标签: c++ sorting recursion quicksort partition

只是为了好玩,我使用std::partition()实现了快速排序,并且遇到了段错误。我找到了一个示例实现here,它只是稍有不同并且可以工作。虽然我可以看到执行它们的效率方面的优势,但我看不到为什么我的段错误。唯一的区别是,我不会再执行std::Partition来避免将与枢轴相同的值传递给以后的递归调用。谁能发现我的问题?

#include <algorithm>
#include <vector>
#include <iostream>

template <typename iter> void quick_sort(iter first, iter last)
{
    if ( std::distance( first, last ) <= 1 )
    {
        return;
    }

    auto pivot = *std::next( first, std::distance( first, last ) / 2 );

#if 0 //works
    iter midpoint1 = std::partition( first, last, [pivot](const auto& x)->bool{ return ( x < pivot ); } );
    iter midpoint2 = std::partition( midpoint1, last, [pivot](const auto& x)->bool{ return !( pivot < x ); } );
    quick_sort( first, midpoint1 );
    quick_sort( midpoint2, last );
#else //segfaults
    iter midpoint = std::partition( first, last, [pivot](const auto& x){ return ( x < pivot ); } );
    quick_sort( first, midpoint );
    quick_sort( midpoint, last );
#endif
}

int main()
{
    std::vector<int> to_sort = {2,1,7,4,6,9,2,1,5,8,9,4,7,4,3,7,4,8,3,8,9};

    quick_sort( std::begin( to_sort ), std::end( to_sort ) );

    for ( auto n : to_sort )
    {
        std::cout << n << ',';
    }

    std::cout << '\n' << std::flush;
}

1 个答案:

答案 0 :(得分:1)

考虑一个序列,其中您选择的枢轴是最小的元素。

然后您的分区将导致一个空序列(停止递归)和原始序列。

重复直到堆栈溢出,或者通过优化尾部调用,使系统耗尽。

顺便说一句,虽然您只能使用较小的>,但在您说的代码中,您使用了较大的<