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

C语言整数数组快速排序问题:代码未实现预期排序的求助

问题排查与修复:C语言快速排序函数无效问题

核心问题分析

你的代码存在三个关键错误,导致排序完全失效:

1. swap 函数逻辑错误

原swap函数仅交换了指针变量本身的地址,并未修改指针指向的实际数组元素值。调用该函数后数组不会产生任何变化。

2. partition 函数未完成枢轴归位

划分过程结束后,没有将枢轴元素放到它最终的正确位置(所有小于它的元素右侧、大于它的元素左侧),导致枢轴位置始终错误,递归无法正确分割数组。

3. partition 返回值与递归范围不匹配

原partition返回的i是第一个大于枢轴的元素位置,但递归时直接使用该值分割数组,导致区间划分错误,部分元素从未被排序。


修复后的完整代码

#include <stdlib.h>
#include <stdio.h>

void print_arr(int arr[], int lon) {
    for (int i = 0; i < lon; i++) {
        printf("%d ", arr[i]);
    }
}

// 修复swap函数:交换指针指向的实际元素值
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int partition(int arr[], int low, int high) {
    int pivote = arr[low];
    int i = low + 1;
    
    for (int j = i; j < high; j++) {
        // 升序排序规则:将小于枢轴的元素移到左侧
        if (arr[j] < pivote) {
            swap(&arr[i], &arr[j]);
            i++;
        }
    }
    // 将枢轴元素放到正确位置:i-1是最后一个小于枢轴的元素下标
    swap(&arr[low], &arr[i-1]);
    // 返回枢轴的最终位置
    return i - 1;
}

void quicksort(int arr[], int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);
        // 递归排序枢轴左侧和右侧的子数组
        quicksort(arr, low, pi);
        quicksort(arr, pi + 1, high);
    }
}

int main() {
    int arr[5] = {3, 4, 1, 2, 5};
    quicksort(arr, 0, 5);

    print_arr(arr, 5);
    puts("");

    return 0;
}

关键修复点说明

  1. swap函数修复:把指针地址交换改为对指针指向的int值进行交换,确保数组元素实际被调换。
  2. partition函数补充枢轴归位:遍历结束后,将枢轴从初始的low位置交换到i-1位置,此时i-1就是枢轴在有序数组中的正确位置。
  3. 调整递归范围:左侧递归范围改为[low, pi](pi是枢轴最终位置,无需再排序),右侧为[pi+1, high],确保所有子数组都被正确处理。

运行修复后的代码,输出将符合预期:1 2 3 4 5

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:07:54