使用 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);
}
我正在使用 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);
}