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
相关产品推荐
相关产品推荐

