只是为了好玩,我使用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;
}
答案 0 :(得分:1)
考虑一个序列,其中您选择的枢轴是最小的元素。
然后您的分区将导致一个空序列(停止递归)和原始序列。
重复直到堆栈溢出,或者通过优化尾部调用,使系统耗尽。
顺便说一句,虽然您只能使用较小的>
,但在您说的代码中,您使用了较大的<
。