我写了一个代码,它使用了qsort from<stdlib.h>。虽然我的代码对于8个数组元素的排序是绝对有效的,但是对于超过10个元素的排序就不行了。我不知道为什么它不起作用,我希望你能帮助我。
谈论问题:我试着对一个有10个元素的浮点数组进行排序。事实上,这个方法不起作用,我试着只使用整数来使它更简单。当我测试它的时候,我意识到qsort在使用8个元素或更少的数组时工作得很好。当我使用8个以上的元素时,它根本不起作用。一些元素(总是相同的)被排序,其他的不是。根本没有列出正确的。所以我尝试了其他代码来解决这个问题,但没有一个代码改变了一些东西。
#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("%f\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("%f\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)
{
int iRet;
float* pf1 = (float*)pcv1;
float* pf2 = (float*)pcv2;
if (*pf1 < *pf2)
{
iRet = -1;
}
if (*pf1 > *pf2)
{
iRet = 1;
}
else
{
iRet = 0;
}
return iRet;
}
int CompareIntegers(const void* pcv1, const void* pcv2)
{
int iRet;
int* pi1 = (int*)pcv1;
int* pi2 = (int*)pcv2;
if (*pi1 < *pi2)
{
iRet = -1;
}
if (*pi1 > *pi2)
{
iRet = 1;
}
else
{
iRet = 0;
}
return iRet;
}
输出(切割部分0):
1.8000 1.9000 4.0000 4.1000 4.6100 4.6110 5.0000 10.0000
1 3 2 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8
预期输出(切割部分0):
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
我阅读了很多代码和更多关于qsort的信息,但是它不能很好地工作。更大数组的元素没有排序,就像它们应该的那样(我认为是这样)。
1条答案
按热度按时间6ojccjat1#
在比较函数中,您在第二个
if
中遗漏了else
。您拥有:
考虑一下当
*pi1 < *pi2
时会发生什么。第一个if
为真,所以我们设置iRet = -1
。然后我们继续处理第二个if
(这是bug)。第二个if
为假,所以我们设置iRet = 0
。这样我们最终返回0,而不是正确的结果-1。三向测试应如下所示:
因此只有一个分支执行。
或者,使用“提前返回”: