c - Qsort从小到高排序
问题描述
有人知道如何编写 qsort 的比较函数吗?我希望 comparefunction1 从最高到最低对数组进行排序,并希望 comparefunction2 从最低到最高对另一个数组进行排序。我的代码:
int cmpfunc(const void *a, const void *b) {
if (*(double*) a < *(double*) b)
return 1;
else if (*(double*) a > *(double*) b)
return -1;
else
return 0;
}
int cmpfunc2(const void *a, const void *b) {
if (*(float*) a < *(float*) b)
return -1;
else if (*(float*) a > *(float*) b)
return 1;
else
return 0;
}
可悲的是,这两个比较函数都是从最高到最低排序的。我想要一个从最低到最高排序。qsort 看起来像这样:
#include "stdio.h"
int main(){
qsort(Acal, 4, sizeof(float), cmpfunc);
qsort(Value, 4, sizeof(float), cmpfunc2);
}
有人看到错误,或者知道如何编写 cmpfunctions 吗?我只想让 Value 数组从最低到最高排序。真正的代码很难理解(我是 c 新手) main.h :
typedef struct{
float Value[5] ;
double Acal[5];
} value;
int cmpfunc();
int cmpfun2();
这是数组,只是不关心结构。我想用 cmpfunc1 排序的数组是双精度(双 Acal [5])
解决方案
看来你混淆了float
和double
。
这显示了如何完成这项工作。double
它对一个数组和一个数组进行排序,float
一次自上而下,一次自下而上。
这是不言自明的:
#include <stdio.h>
#include <stdlib.h>
// compare functions for top down sorting
int cmpfuncDoubleTopDown(const void* a, const void* b) {
if (*(double*)a < *(double*)b)
return 1;
else if (*(double*)a > *(double*)b)
return -1;
else
return 0;
}
int cmpfuncFloatTopDown(const void* a, const void* b) {
if (*(float*)a < *(float*)b)
return 1;
else if (*(float*)a > *(float*)b)
return -1;
else
return 0;
}
// compare functions for top bottom up sorting
int cmpfuncDoubleBottomUp(const void* a, const void* b) {
if (*(double*)a > *(double*)b)
return 1;
else if (*(double*)a < *(double*)b)
return -1;
else
return 0;
}
int cmpfuncFloatBottomUp(const void* a, const void* b) {
if (*(float*)a > *(float*)b)
return 1;
else if (*(float*)a < *(float*)b)
return -1;
else
return 0;
}
int main() {
double dvalues[] = { 3.0, 1.0, 4.0, 2.0 };
float fvalues[] = { 3.0f, 1.0f, 4.0f, 2.0f };
// sort top down
qsort(dvalues, 4, sizeof(double), cmpfuncDoubleTopDown);
qsort(fvalues, 4, sizeof(float), cmpfuncFloatTopDown);
for (int i = 0; i < 4; i++)
printf("%f ", fvalues[i]);
printf("\n");
for (int i = 0; i < 4; i++)
printf("%f ", dvalues[i]);
printf("\n");
// sort bottum up
qsort(dvalues, 4, sizeof(double), cmpfuncDoubleBottomUp);
qsort(fvalues, 4, sizeof(float), cmpfuncFloatBottomUp);
for (int i = 0; i < 4; i++)
printf("%f ", fvalues[i]);
printf("\n");
for (int i = 0; i < 4; i++)
printf("%f ", dvalues[i]);
printf("\n");
}
推荐阅读
- python - 列表索引未在 for 循环中更新(python)
- c# - 根据时区在一天中的特定时间安排hangfire作业
- r - 在闪亮的应用程序中更改标签内的字体
- c# - 是否可以在低于 6 的 EF 版本中拦截来自 EF 的数据库查询?
- angular - 将 environment.ts 传递给 Angular 库模块
- r - R中一张图表上的多条线
- c# - 使用 AutoMapper 将 ef 模型映射到 dto,DateTime 数据类型引发异常
- vue.js - 如何在 v-for 循环中调用模态组件?
- mysql - mysql在状态A,B和状态C中选择没有卡的用户
- c++ - 如何通过输入十进制数字打印 UTF-8 符号?