C语言快速排序实现异常:输出结果不符合预期求助
问题排查与修复
你的快速排序逻辑本身是正确的,但swap函数的实现方式存在隐藏问题,这是导致输出异常的根本原因。
问题分析
你当前使用的swap函数通过加减运算交换值,看似能正常交换不同变量,但存在两个致命缺陷:
- 交换同一元素时的隐含风险:当
x和y指向同一个内存地址(比如partition循环中i==j的情况),虽然表面上值不会改变,但多次执行这类无意义交换可能因编译器优化或特定环境导致不可预期的行为。 - 整数溢出风险:当两个大数相加超过
int类型的取值范围时,会触发未定义行为,即使当前测试用例是小数值,也可能在其他场景下出错。
你的测试输出中出现大量0,大概率是因为在递归排序过程中,某些元素被错误修改,而加减交换的实现恰好放大了这个问题。
修复方案
将swap函数改为使用临时变量的标准实现,这是最安全、可靠的方式:
void swap(int* x, int* y) { int temp = *x; *x = *y; *y = temp; }
替换后重新运行代码,测试数组{5,3,7,0,1,4,8,9,6,2}会被正确排序为:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 。
额外验证
你的partition函数逻辑是正确的:选择末尾元素作为基准,遍历数组将小于等于基准的元素移到左侧,最后将基准放到正确位置,符合快速排序的Lomuto分区逻辑。递归调用的参数也没有问题,只要swap函数正常工作,排序就能正确执行。
内容的提问来源于stack exchange,提问作者deto
相关产品推荐
相关产品推荐

