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
相关产品推荐
相关产品推荐

