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

C语言快速排序代码输入n>40时中途停止的问题求助

快速排序死循环问题排查与修复

你的代码在处理包含重复元素的数组时会触发死循环,导致程序停滞,根源在于partition函数的两处关键错误:


1. 错误的Pivot交换操作

在partition函数末尾,你执行了swap(&pivot, &a[j]);,但pivot是局部变量,并非数组中的元素。这步操作只会交换局部变量和a[j]的值,而数组中原本作为基准的a[low]完全没被修改,导致分区逻辑彻底错误,后续递归调用会陷入无限循环。

修复方案:
将原基准位置a[low]与j位置的元素交换,因为循环结束后j就是基准值应处的正确位置:

swap(&a[low], &a[j]);

2. 未处理等于Pivot的元素导致死循环

你的两个while循环条件为a[i] < pivot和a[j] > pivot,当数组中存在等于基准值的元素时,i和j会停在这些位置。若此时i<j,交换后元素依然等于基准值,下一轮循环指针不会移动,直接触发死循环。

修复方案:
将循环条件改为小于等于/大于等于,让指针能跳过等于基准值的元素:

while (a[i] <= pivot && i < high) 
    i++;
while (a[j] >= pivot && j > low)
    j--;

修复后的完整partition函数

int partition(int a[], int low, int high)
{
    int i, j, pivot;
    pivot = a[low];
    i = low;
    j = high;

    while (i < j) {
        while (a[i] <= pivot && i < high) 
            i++;

        while (a[j] >= pivot && j > low)
            j--;

        if (i < j) {
           swap(&a[i], &a[j]);
        }
    }
    swap(&a[low], &a[j]);
    return j;
}

额外优化建议

  • 标准C中void main()并非规范写法,建议改为int main()并在末尾添加return 0;
  • 输出Before sorting:后添加换行符,避免输出内容挤在一起

修复后输入n=50或更大数值,程序将正常完成排序并输出结果。

内容的提问来源于stack exchange,提问作者Venkat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 18:32:35