使用 qsort() 对结构数组中的双精度数进行排序

Using qsort() to sort doubles in an array of structs

我正在使用 qsort() 对结构数组中的双精度值按降序排序。我有以下代码:

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

typedef struct page {
   double val;
   int id;
} page;

int cmpfunc(const void *a, const void *b) {
  const page *pageA = (page*)a;
  const page *pageB = (page*)b;
  return -(pageA->val - pageB->val);
}

int main(void) {
  page array[5];
  int n;
  int i = 1;

for(n = 0; n < 5; n++) {
    array[n].id = i;
    i++;
}

array[0].val = 0.0608;
array[1].val = 0.2230; 
array[2].val = 0.1673;
array[3].val = 0.1442;
array[4].val = 0.2499;

printf("Before sorting\n");

for(n = 0; n < 5; n++) {
    printf("page id = %d, val = %lf \n", array[n].id, array[n].val);
}

qsort(array, 5, sizeof(page), cmpfunc);

printf("\nAfter sorting\n");

for(n = 0; n < 5; n++) {
    printf("page id = %d, val = %lf \n", array[n].id, array[n].val);
}

return 0;
}

我试过使用 qsort() 对整数进行排序,它成功了。但是,当尝试对双打进行排序时,我的输出未排序:

排序后:

页面 id = 2,val = 0.223000

页面 id = 3,val = 0.167300

页面 id = 4,val = 0.144200

页面 id = 5,val = 0.249900

页面 id = 1,val = 0.060800

我不确定为什么输出没有正确排序。我在网上阅读了关于在结构数组中对值进行排序的帖子,我相信我的比较函数是正确的。任何见解将不胜感激。

这是因为比较函数returns一个整数。 -(pageA->val - pageB->val) 的结果将四舍五入。

切换到

if (pageA->val == pageB->val)
    return 0;
else if(pageA->val > pageB->val)
    return 1;
else
    return -1;

I believe that my comparison function is correct.

在这里提示。如果你只相信一个功能是正确的,那就测试它来确定。您通过打印结果验证了排序不起作用。您还可以打印比较函数的输出。

所以我们可以看到数组正在排序(那些id已经移动了)。而且 id 和值仍然正确匹配,因此 qsort 正确移动数据(我们没有 sizeof 错误)。

所以我们的问题一定是我们传递的比较函数。一起来看看:

int cmpfunc(const void *a, const void *b) {
  const page *pageA = (page*)a;
  const page *pageB = (page*)b;
  return -(pageA->val - pageB->val);
}

Returns 一个整数,我们正在比较双精度数。 pageA->val - pageB->val 的结果是一个双精度数,然后四舍五入为 int。这意味着当它们不相等时,它有时会四舍五入为零(意思是相等)。

更好的是:

int cmpfunc(const void *a, const void *b) {
  const page *pageA = (page*)a;
  const page *pageB = (page*)b;
  if (pageA->val == pageB->val)
      return 0;
  else
      return (pageA->val > pageB->val ? 1 : -1);
}