【问题标题】:qsort (float 2D array) bug in this value <stdlib.h>此值中的 qsort(浮点 2D 数组)错误 <stdlib.h>
【发布时间】:2016-04-03 03:06:00
【问题描述】:

我尝试制作first value = first value / second value 并对其进行排序:

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

    int cmp (const void * a, const void * b)
    {return ( *(float*)a -  *(float*)b );}

    int main()
    {
        float Array[4][2]=  {{10,10},
                             {5, 10},
                             {5, 5 },
                             {2, 5}};

        int i,j;

        for(j=0;j<4;j++)     //first value = first value / second value
        { 
            Array[j][0]=Array[j][0]/Array[j][1];   
        }


        qsort(Array, 4, 2*sizeof(Array[0][0]), cmp);


        for(j=0;j<4;j++)     //JUST PRINTF
        {
            for(i=0;i<2;i++)
                  printf("%.1f ",Array[j][i]);
            printf("\n");
        }
    }

 

before qsort -------- after qsort -----  my expect


1.0 10.0 ------------- 0.5 10.0 -------- 0.4  5.0    

0.5 10.0 ------------- 1.0 5.0  -------- 0.5  10.0   

1.0 5.0  ------------- 0.4 5.0  -------- 1.0  5.0    

0.4 5.0  ------------- 1.0 10.0 -------- 1.0  10.0 

qsort 输出后很奇怪。你能告诉我我误解了什么吗?

【问题讨论】:

    标签: c arrays floating-point quicksort qsort


    【解决方案1】:

    您的比较函数不正确。它(隐式) 转换两个浮点值的差 通过将其截断为整数。因此两个浮点 如果它们的差异是严格的,则值被认为是相等的 小于1.0

    正确的比较函数应该是

    int cmp (const void * a, const void * b)
    {
        float x = *(float*)a;
        float y = *(float*)b;
        return x < y ? -1 : x == y ? 0 : 1;
    }
    

    修改后,你的程序的输出是

    0.4 5.0 
    0.5 10.0 
    1.0 10.0 
    1.0 5.0 
    

    所以数组相对于第一个“列”正确排序。

    【讨论】:

      猜你喜欢
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      • 2021-03-23
      相关资源
      最近更新 更多