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

快速排序代码无输出求助:单独index函数正常,集成后无输出

快速排序无输出问题排查与修复

我来帮你搞定这个问题!你的代码之所以没输出,是因为quickSort函数陷入了无限递归,程序根本没机会走到main函数里的输出循环。咱们一步步拆解问题:

核心问题1:分区函数返回值错误

你的index函数负责找到pivot元素的正确位置,但最后返回的start是错误的——它指向的是pivot位置的下一个索引,而我们需要返回pivot本身的索引。

看一下逻辑:当循环遍历到最后一个元素(也就是pivot自己)时,肯定满足a[i] <= piv的条件,这会触发交换并让start自增1。循环结束后,start已经跳到了第一个大于pivot的元素位置,所以正确的pivot索引应该是start - 1。

修正后的index函数:

int index(int* a, int s, int e) {
    int i, start, piv, temp;
    start = s;
    piv = a[e];
    for (i = start; i <= e; i++) {
        if (a[i] <= piv) {
            temp = a[i];
            a[i] = a[start];
            a[start] = temp;
            start++;
        }
    }
    return start - 1; // 这里是关键修正
}

核心问题2:无限递归导致程序卡死

因为index返回了错误的start值(比如对于长度为8的数组,返回值会是8),你在quickSort里调用quickSort(a, s, pivot - 1)时,pivot - 1就等于7,和最初的调用quickSort(A, 0, 7)完全一致。这就导致函数无限重复调用自己,程序一直卡在递归栈里,永远执行不到后面的输出代码。

当修正index的返回值后,递归的边界就正常了:每次把数组分成pivot左侧(s到pivot-1)和右侧(pivot+1到e)的子数组,直到子数组长度为1时停止递归。

完整修正代码

#include <iostream>
using namespace std;
int index(int* a, int s, int e) {
    int i, start, piv, temp;
    start = s;
    piv = a[e];
    for (i = start; i <= e; i++) {
        if (a[i] <= piv) {
            temp = a[i];
            a[i] = a[start];
            a[start] = temp;
            start++;
        }
    }
    return start - 1;
}
void quickSort(int* a, int s, int e) {
    int pivot;
    if (s < e) {
        pivot = index(a, s, e);
        quickSort(a, s, pivot - 1);
        quickSort(a, pivot + 1, e);
    }
}
int main() {
    int A[] = {2, 5, 8, 3, 6, 9, 1, 4};
    quickSort(A, 0, 7);
    // 加空格让输出更易读
    for (int i = 0; i < 8; i++) {
        cout << A[i] << " ";
    }
    return 0;
}

运行这段代码后,预期输出是:1 2 3 4 5 6 8 9

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:42:40