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

这段C++快速排序代码存在什么问题?需如何修正?

快速排序代码的修正方案

你的代码存在多处逻辑错误,以下是具体问题和修正方式:

  • 外层循环条件完全错误
    原代码中while(i<pivot && j>pivot)是把索引值和基准值做比较,完全不符合快速排序的分区逻辑。正确的条件应该是while(i <= j),用于控制i和j向中间移动,直到二者交叉。

  • 内层循环缺失越界检查
    原代码里的while(a[i]<=pivot)和while(a[j]>pivot)没有判断索引是否超出数组范围,会导致数组越界访问。修正后应为:
    while(i <= high && a[i] <= pivot)
    while(j >= low && a[j] > pivot)

  • 分区与递归的执行逻辑错误
    原代码将基准值归位和递归调用的代码放在if(i<j)分支内,这会导致当i和j交叉时,基准值无法回到正确位置,递归也不会触发。正确的做法是:在完成i和j的移动后,不管是否交换过元素,都要把基准值(原low位置的元素)和j位置的元素交换,再递归处理左右子数组。

  • 函数返回值不匹配
    函数f声明为int类型,但内部没有任何返回语句,属于未定义行为。应将返回类型改为void。

  • 外层循环的执行逻辑错误
    原外层while只执行一次内层循环就退出,正确逻辑是:在内层找到需要交换的i和j后,交换二者指向的元素,然后继续移动i和j,直到i>j。


修正后的完整代码:

#include <iostream>
using namespace std;

void f(int a[], int low, int high) {
    int pivot, i, j, t;
    if (low < high) {
        pivot = a[low];
        i = low + 1;
        j = high;

        while (i <= j) {
            // 找到第一个大于pivot的元素
            while (i <= high && a[i] <= pivot) {
                i++;
            }
            // 找到第一个小于等于pivot的元素
            while (j >= low && a[j] > pivot) {
                j--;
            }
            // 若i还在j左边,交换元素
            if (i < j) {
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
        // 将基准值放到正确的位置
        a[low] = a[j];
        a[j] = pivot;
        // 递归处理左右子数组
        f(a, low, j - 1);
        f(a, j + 1, high);
    }
}

int main() {
    int a[100], i, n, low, high;
    cout << "Enter size of array" << endl;
    cin >> n;
    cout << "Enter elements in array" << endl;
    for (i = 0; i < n; i++) {
        cin >> a[i];
    }
    low = 0;
    high = n - 1;
    f(a, low, high);
    cout << "Sorted array:" << endl;
    for (i = 0; i < n; i++) {
        cout << a[i] << " ";
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:40:30