2015-12-29 9 views
0

Я попытался сделал first value = first value/second value и сортировать его:QSort (поплавок 2D массив) ошибка в этом значении <stdlib.h>

#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 странно. Можете ли вы рассказать мне, что я неправильно понял?

ответ

2

Неправильная комбинация функций. Он (неявно) преобразует разность двух значений с плавающей запятой путем усечения его в целое. Поэтому два значения с плавающей запятой считаются равными, если их разность составляет строго менее 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 

поэтому массив правильно отсортирован по отношению к первой колонке «».