C 使用qsort()对结构数组中的double进行排序
我正在使用C 使用qsort()对结构数组中的double进行排序,c,qsort,C,Qsort,我正在使用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
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;
}
#包括
#包括
类型定义结构页{
双val;
int-id;
}页面;
int cmpfunc(常数无效*a,常数无效*b){
常数页*页a=(页*)a;
常数页*pageB=(第*)页b;
返回-(pageA->val-pageB->val);
}
内部主(空){
页面数组[5];
int n;
int i=1;
对于(n=0;n<5;n++){
数组[n].id=i;
i++;
}
数组[0].val=0.0608;
数组[1].val=0.2230;
数组[2],val=0.1673;
数组[3],val=0.1442;
数组[4].val=0.2499;
printf(“排序前”);
对于(n=0;n<5;n++){
printf(“页面id=%d,val=%lf\n”,数组[n].id,数组[n].val);
}
qsort(数组,5,sizeof(第页),cmpfunc);
printf(“\n排序后\n”);
对于(n=0;n<5;n++){
printf(“页面id=%d,val=%lf\n”,数组[n].id,数组[n].val);
}
返回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
我不知道为什么输出没有正确排序。我在网上读过关于在结构数组中排序值的帖子,我相信我的比较函数是正确的。任何洞察都将不胜感激。这是因为compare函数返回一个整数。
-(pageA->val-pageB->val)
的结果将四舍五入
切换到
if (pageA->val == pageB->val)
return 0;
else if(pageA->val > pageB->val)
return 1;
else
return -1;
我相信我的比较函数是正确的
普罗蒂普在这里。如果您只相信某个函数是正确的,那么请测试它以确保正确。您已通过打印结果验证排序不起作用。您还可以打印比较函数的输出。这样我们就可以看到数组正在排序(那些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);
}
返回一个int,我们正在比较double。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()比较两个值“a”和“b”时,如果“a”放在“b”之前,函数必须返回负值;如果“a”放在“b”之后,函数必须返回正值;如果“a”和“b”相等,函数必须返回零。如果'a'>'b',则比较函数将返回1,但如果'a'<'b',则比较函数将返回0。我对“a”<“b”的情况感到困惑,因为在这种情况下,“a”将放在“b”之前,但compare函数将返回0而不是-1。如果函数不返回-1,qsort()如何知道将“a”放在“b”之前?我已经解决了这个问题。注意:各种编译器在创建高效代码时都认识到的一个常见代码习惯用法是
return(A>b)-(A