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

C语言快速排序中arr[i]与pivot交换异常问题求助

问题分析与修复

核心错误:错误的交换对象

你代码里最后一行的swap(&arr[i], &pvt);是无效的,因为pvt是一个局部变量,它只是存储了arr[high]的初始值,并不是数组元素的引用。交换这个局部变量和arr[i],只会改变局部变量pvt的值,完全不会修改原数组中原本存放pivot的位置(arr[high])。

正确的做法是交换arr[i]和arr[high]——因为pivot最初是从arr[high]取的,最终要把它放到分区后的正确位置i,所以直接操作数组的对应位置即可。

额外问题:缺少递归逻辑

你的quickSort函数只完成了一次分区,没有递归处理pivot左右两侧的子数组,这样无法完成整个数组的排序。需要在分区完成后,分别对左半部分(low到i-1)和右半部分(i+1到high)递归调用quickSort,同时要加递归终止条件(当low >= high时直接返回)。

修复后的完整代码

#include <stdio.h>
void printArr(int arr[], int n)
{
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
}

void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void quickSort(int arr[], int low, int high)
{
    // 递归终止条件:区间无效或只有一个元素
    if (low >= high)
        return;

    int pvt = arr[high];
    int i = low;
    int j = high;

    while (i < j)
    {
        while (pvt > arr[i])
            i++;
        while (pvt <= arr[j])
            j--;

        if (i < j)
            swap(&arr[i], &arr[j]);
    }
    // 交换arr[i]和原pivot所在的arr[high]
    swap(&arr[i], &arr[high]);
    printArr(arr, high + 1);

    // 递归处理左半部分和右半部分
    quickSort(arr, low, i - 1);
    quickSort(arr, i + 1, high);
}

int main() // 标准C中main的返回类型应为int
{
    int arr[] = {10, 16, 8, 12, 15, 6, 3, 9, 5};
    int n = sizeof(arr) / sizeof(arr[0]);

    quickSort(arr, 0, n - 1);
    return 0;
}

修复说明

  1. 把swap(&arr[i], &pvt);改为swap(&arr[i], &arr[high]);,确保修改的是数组中的元素,完成pivot的正确归位。
  2. 添加递归终止条件if (low >= high) return;,避免无限递归。
  3. 在分区完成后,递归调用quickSort处理左右子数组,完成整个排序流程。
  4. 修正main函数的返回类型为int并添加return 0;,符合C语言标准。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:06:24