qsort比较函数未对整个数组排序(遗漏1个元素)问题排查
解决qsort自定义比较函数未完全排序的问题
看起来你在使用qsort排序结构体数组时碰到了小麻烦——总有一个元素没被正确排序。我帮你排查了一下,问题主要出在两个地方:
1. 未完成的列比较逻辑
你的比较函数里,当两个元素的linha(行号)相等时,代码只写了一半就中断了(i...)。这就导致当行号相同时,qsort不知道该怎么判断两个元素的相对顺序,自然会出现部分元素排序异常的情况。
2. 类型不匹配的隐藏坑
结构体里的linha和coluna是unsigned long类型,但你在比较函数里把它们强制转换成了int。如果这两个值超过了int的取值范围,会直接导致溢出,比较结果完全错误,这也是排序不稳定的潜在诱因。
修正后的完整比较函数
我给你调整了代码,补全逻辑同时修复了类型问题:
int lcomparator(const void *el1, const void *el2) { // 直接使用结构体定义的unsigned long类型,避免转换溢出 unsigned long l1 = ((elemento *)el1)->linha; unsigned long l2 = ((elemento *)el2)->linha; if (l1 != l2) { // 无符号数比较,直接返回差值的正负符号 return (l1 > l2) ? 1 : -1; } else { // 行号相同时,按列号继续排序 unsigned long c1 = ((elemento *)el1)->coluna; unsigned long c2 = ((elemento *)el2)->coluna; return (c1 > c2) ? 1 : -1; } }
额外检查点
除了比较函数,你还要确认index参数是数组中实际有效元素的个数,而不是MAXN。如果index比实际元素数少1,那最后一个元素根本不会被纳入排序范围,看起来就像没被排序一样。
内容的提问来源于stack exchange,提问作者Guilherme Fernandes
相关产品推荐
相关产品推荐

