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

时间:2018-07-23 01:40:24

标签: c qsort

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

Date currentDate = Calendar.getInstance(TimeZone.getDefault()).getTime()

我尝试使用qsort()对整数进行排序,并且它已经奏效。但是,当尝试对double进行排序时,我的输出未排序:

排序后:

页面ID = 2,值= 0.223000

页面ID = 3,值= 0.167300

页面ID = 4,val = 0.144200

页面ID = 5,值= 0.249900

页面ID = 1,值= 0.060800

我不确定为什么输出没有正确排序。我已经在线阅读了有关对结构数组中的值进行排序的文章,并且我相信我的比较功能是正确的。任何见解将不胜感激。

2 个答案:

答案 0 :(得分:2)

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

切换到

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

我相信我的比较功能是正确的。

此处提示。如果您仅认为某个功能正确,请对其进行测试以确保功能正确。您通过打印结果验证了排序不起作用。您也可以打印比较功能的输出。

答案 1 :(得分:2)

因此我们可以看到该数组正在排序(这些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);
}

返回一个整数,我们正在比较双精度数。 pageA->val - pageB->val的结果是一个double,然后将其舍入为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);
}