You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何计算双迭代器中间值时会触发段错误或程序挂起?

Hoare分区快速排序:直接用中间迭代器当枢轴的坑

我基于维基百科的Hoare分区实现了快速排序,一开始用ptrdiff_t计算两个迭代器的偏移,取中间位置的值作为枢轴时,代码跑起来完全正常。但改成直接拿中间迭代器(比如pivot_mid)让pivot_指向它之后,程序要么卡着不动,要么直接触发SIGSEGV。查了半天才发现问题出在std::swap(*i, *j)——这个操作会修改pivot_指向的元素值,直接把分区逻辑搞崩了,而提前把枢轴值存成固定变量就没这事儿。

问题根源

Hoare分区的核心是靠固定的枢轴值来驱动左右指针移动。如果你的枢轴是个指向数组元素的迭代器,那swap操作会直接改掉这个元素的值,后续指针移动的判断条件全乱了:该停的指针不停,该交换的元素没交换,要么死循环挂起,要么越界访问触发段错误。

解决办法

不管你选首、尾、中间还是随机位置当枢轴点,都要先把该位置的元素值存到临时变量里,整个分区过程的比较逻辑都用这个固定值,别直接用迭代器指向的元素。举个代码片段:

// 错误姿势:直接绑定迭代器
auto pivot_it = arr.begin() + (arr.end() - arr.begin()) / 2;
// 正确姿势:先存枢轴值
int pivot_val = *pivot_it;

之后分区时所有*i和*j的比较都跟pivot_val比,哪怕原枢轴位置的元素被swap改了,也不会影响逻辑判断。

内容的提问来源于stack exchange,提问作者B. A. Sylla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:40:32