C语言 为什么qsort最多只能排序8个元素

c90pui9n  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(193)

我写了一个代码,它使用了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的信息,但是它不能很好地工作。更大数组的元素没有排序,就像它们应该的那样(我认为是这样)。

6ojccjat

6ojccjat1#

在比较函数中,您在第二个if中遗漏了else
您拥有:

if (*pi1 < *pi2)
        iRet = -1;
    if (*pi1 > *pi2)
        iRet = 1;
    else
        iRet = 0;

考虑一下当*pi1 < *pi2时会发生什么。第一个if为真,所以我们设置iRet = -1。然后我们继续处理第二个if(这是bug)。第二个if为假,所以我们设置iRet = 0。这样我们最终返回0,而不是正确的结果-1。
三向测试应如下所示:

if (*pi1 < *pi2)
        iRet = -1;
    else if (*pi1 > *pi2) // note else here
        iRet = 1;
    else
        iRet = 0;

因此只有一个分支执行。
或者,使用“提前返回”:

if (*p1 < *p2)
      return -1;
   if (*p1 > *p2)
      return 1;
   return 0;

相关问题