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

qsort排序仅支持最多8个元素?数组超长度排序异常求助

qsort排序长数组失效的原因及修复方案

你的问题核心是比较函数的逻辑错误,和数组长度无关——短数组能正常排序只是巧合:qsort在处理元素较少的数组时,可能会使用插入排序(对错误的比较结果容忍度更高),而长数组会触发快速排序,此时错误的比较逻辑会直接导致排序失效。

问题根源

你写的CompareFloat和CompareIntegers函数中,使用了两个独立的if语句而非else if,导致返回值被错误覆盖:
比如当*pf1 < *pf2成立时,你先将iRet设为-1,但紧接着的if (*pf1 > *pf2)不成立,会进入else分支把iRet改成0,最终返回了错误的0而非-1。这种错误的返回值会让qsort的排序逻辑判断混乱,直接导致长数组排序失败。

修复后的代码

将比较函数的逻辑改为if-else if-else结构,或者使用更简洁的正确写法:

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

int CompareFloat(const void* pcv1, const void* pcv2);
int CompareIntegers(const void* pcv1, const void* pcv2);

int main()
{
    int aiArr[10] = { 10,9,8,7,5,6,4,2,3,1};
    int aiArr2[8] = { 8,7,6,5,4,2,3,1 };
    float afArr[8] = { 5.0f, 4.611f, 4.61f, 4.1f, 4.0f, 10.0f, 1.9f, 1.8f };
    
    // 打印原数组
    for (int i = 0; i < 8; i++)
    {
        printf("%.4f\t", afArr[i]);
    }
    puts("\n");
    for (int i = 0; i < 10; i++)
    {
        printf("%i\t", aiArr[i]);
    }
    puts("\n");
    for (int i = 0; i < 8; i++)
    {
        printf("%i\t", aiArr2[i]);
    }

    qsort(aiArr2, 8, sizeof(int), CompareIntegers);
    qsort(aiArr, 10, sizeof(int), CompareIntegers);
    qsort(afArr, 8, sizeof(float), CompareFloat);
    puts("\n");

    // 打印排序后数组
    for (int i = 0; i < 8; i++)
    {
        printf("%.4f\t", afArr[i]);
    }
    puts("\n");
    for (int i = 0; i < 10; i++)
    {
        printf("%i\t", aiArr[i]);
    }
    puts("\n");
    for (int i = 0; i < 8; i++)
    {
        printf("%i\t", aiArr2[i]);
    }

    return 0;
}

// 修复后的浮点数比较函数
int CompareFloat(const void* pcv1, const void* pcv2)
{
    float pf1 = *(float*)pcv1;
    float pf2 = *(float*)pcv2;
    
    if (pf1 < pf2)
        return -1;
    else if (pf1 > pf2)
        return 1;
    else
        return 0;
}

// 修复后的整数比较函数(简洁版,注意:若数组包含极大/极小int值可能溢出,需用if-else结构)
int CompareIntegers(const void* pcv1, const void* pcv2)
{
    return *(int*)pcv1 - *(int*)pcv2;
}

验证结果

修复后运行代码,输出将完全符合你的预期:

1.8000 1.9000 4.0000 4.1000 4.6100 4.6110 5.0000 10.0000

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:01:17