- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一直在尝试实现我的代码作为对包括 NaN 在内的所有整数进行排序的方法。然而,似乎找不到可以将 NaN 排序到我的程序中的函数。代码能够对包括无穷大在内的其他整数进行排序,但是,当输入 nan 时,程序会识别输入,但不会将其排序到列表的开头。任何帮助,将不胜感激。
#include <stdio.h>
#include <math.h>
int main()
{
float array[100], swap;
int c, d, n;
printf("Enter the size of array\n");
scanf("%d", &n);
printf("Enter %d integers\n", n);
for (c = 0; c < n; c++)
scanf("%f", &array[c]);
for (c = 0; c < (n - 1); c++)
{
for (d = 0; d < n - c - 1; d++)
{
if (array[d] > array[d + 1])
{
swap = array[d];
array[d] = array[d + 1];
array[d + 1] = swap;
}
}
}
printf("Sorted array in ascending order:\n");
for (c = 0; c < n; c++)
printf("%f\n", array[c]);
return 0;
}
最佳答案
请注意,根据 C 标准,两个 NaN 值永远不会相等,即使它们具有相同的位模式。如果您要使用 NaN 对数据进行排序,您需要:
a > b
更精细的测试比较。您可以找到分散在 C11 标准周围的相关信息。例如:
<float.h>
isnan
macro signbit
macro fmax
functions 您可能会安排创建一个函数(可能是 inline
函数,除非您要将它传递给像 qsort()
这样的函数)来比较相关类型的两个浮点值(看起来像您正在使用 float
),它使用 isnan()
或isnanf()
分类宏来确定一个或两个值是否为 NaN。如果两个值都是 NaN,该函数可能会返回一个指示相等的值,但如果其中一个是 NaN,则返回值会将其放置在另一个值之前或之后,具体取决于您希望 NaN 出现的顺序,并且它将返回用于比较其他值(正常值、零、无穷大、次正常数)的适当值 - 常规值和无穷大仅需要常规比较运算符,除非您需要对负零与正零进行正确排序。
例如,编写一个与 qsort()
一起使用的函数(并且使用类型 double
而不是 float
)会产生类似的结果,假设数字应按升序排序,并且 NaN 应该比任何其他值都小。该代码包括从标准输入读取数据、打印数据、排序并再次打印的测试代码。
#include <math.h>
/* Belongs in a header! */
extern int cmp_double(const void *v1, const void *v2);
/* Sort doubles, with NaNs coming first */
/* Switch return values -1 and +1 after testing n1, n2 to sort NaNs last */
int cmp_double(const void *v1, const void *v2)
{
double d1 = *(const double *)v1;
double d2 = *(const double *)v2;
int n1 = isnan(d1);
int n2 = isnan(d2);
if (n1 && n2)
return 0;
if (n1)
return -1;
if (n2)
return +1;
if (d1 < d2)
return -1;
if (d1 > d2)
return +1;
// The values are 'equal', but …
if (d1 != 0.0)
return 0;
// They're both zero, but they could have different signs
int s1 = signbit(d1);
int s2 = signbit(d2);
if (s1 != s2)
return (s1) ? -1 : +1;
return 0;
}
#include <stdio.h>
#include <stdlib.h>
static void dump_doubles(const char *tag, int num, double values[num])
{
printf("%s (%d):\n", tag, num);
int line_len = 0;
for (int i = 0; i < num; i++)
{
int n = printf(" %+12.4f", values[i]);
if (n <= 0)
break;
line_len += n;
if (line_len >= 60)
{
line_len = 0;
putchar('\n');
}
}
if (line_len > 0)
putchar('\n');
}
int main(void)
{
enum { NUM_VALUES = 50 };
double values[NUM_VALUES];
int i = 0;
for (i = 0; i < NUM_VALUES; i++)
{
if (scanf("%lf", &values[i]) != 1)
break;
}
dump_doubles("Before sort", i, values);
qsort(values, i, sizeof(values[0]), cmp_double);
dump_doubles("After sort", i, values);
return 0;
}
注意将 -0.0 排序在 +0.0 之前所需的测试!
考虑输入数据:
3023.421800 9033.902200 nan -9370.952500 3088.884900 6829.135400 0
-0.000000 -inf -5267.546800 -8784.373300 5663.944600 -9728.231300 inf
-inf -5373.038600 4282.941600 6245.734200 -5533.975400 nan 8445.713600
+inf -9108.960400 -3796.671200 nan -2363.851300 877.460400 9936.416900
-3480.867400
输出是:
Before sort (29):
+3023.4218 +9033.9022 nan -9370.9525 +3088.8849
+6829.1354 +0.0000 -0.0000 -inf -5267.5468
-8784.3733 +5663.9446 -9728.2313 +inf -inf
-5373.0386 +4282.9416 +6245.7342 -5533.9754 nan
+8445.7136 +inf -9108.9604 -3796.6712 nan
-2363.8513 +877.4604 +9936.4169 -3480.8674
After sort (29):
nan nan nan -inf -inf
-9728.2313 -9370.9525 -9108.9604 -8784.3733 -5533.9754
-5373.0386 -5267.5468 -3796.6712 -3480.8674 -2363.8513
-0.0000 +0.0000 +877.4604 +3023.4218 +3088.8849
+4282.9416 +5663.9446 +6245.7342 +6829.1354 +8445.7136
+9033.9022 +9936.4169 +inf +inf
关于c - 如何对包含 NaN 的 C 数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55151688/
我正在尝试对每个条目有多个值的关联数组进行排序。 例如 [0] => stdClass Object ( [type] => node [sid] => 158 [score] => 0.059600
我在 mysql 中有“日期”列以这种格式保存日期 2014 年 9 月 17 日(日-月-年) 我需要对它们进行升序排序,所以我使用了这个命令: SELECT * FROM table ORDER
我目前正在将 MySQL 存储过程重写为 MS SQL 存储过程,但遇到了问题。 在 MySQL 存储过程中,有一个游标,它根据最近的日期 (effdate) 选择一个值并将其放入变量 (thestt
我想要 gwt r.QuestionId- 排序。但是我得到未排序的 QuestionId 尽管我提到了 QuestionId ASC 的顺序。 SELECT r.QuestionId,
我有一个关于在 scandir 函数中排序的基本问题。到目前为止,我阅读了 POSIX readdir 的手册页,但没有找到有关订购保证的具体信息。 但是当我遍历大目录(无法更改,只读)时,我在多个系
基本上我必须从 SQL 数据库中构建项目列表,但是用户可以选择对 7 个过滤器的任意组合进行过滤,也可以选择要排序的列以及按方向排序。 正如您可以想象的那样,这会以大量不同的组合进行编码,并且数据集非
我有两张 table 。想象第一个是一个目录,包含很多文件(第二个表)。 第二个表(文件)包含修改日期。 现在,我想选择所有目录并按修改日期 ASC 对它们进行排序(因此,最新的修改最上面)。我不想显
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
在 C++ 中,我必须实现一个“类似 Excel/Access”(引用)的查询生成器,以允许对数据集进行自定义排序。如果您在 Excel 中使用查询构建器或 SQL 中的“ORDER BY a, b,
我面临这样的挑战: 检索按字段 A 排序的文档 如果字段 B 存在/不为空 . 否则 按字段排序 C. 在 SQL 世界中,我会做两个查询并创建一个 UNION SELECT,但我不知道如何从 Mon
我想对源列表执行以下操作: map 列表 排序 折叠 排序 展开 列表 其中一些方法(例如map和toList)是可链接的,因为它们返回非空对象。但是,sort 方法返回 void,因为它对 List
我制作了一个用于分析 Windows 日志消息编号的脚本。 uniq -c 数字的输出很难预测,因为根据数字的大小会有不同的空白。此时,我手动删除了空白。 这是对消息进行排序和计数的命令: cat n
我有以下词典: mydict1 = {1: 11, 2: 4, 5: 1, 6: 1} mydict2 = {1: 1, 5: 1} 对于它们中的每一个,我想首先按值(降序)排序,然后按键(升序)排序
我刚刚开始使用泛型,目前在对多个字段进行排序时遇到问题。 案例: 我有一个 PeopleList 作为 TObjectList我希望能够通过一次选择一个排序字段,但尽可能保留以前的排序来制作类似 Ex
有没有办法在 sql 中组合 ORDER BY 和 IS NULL 以便我可以在列不为空时按列排序,但如果它为null,按另一列排序? 最佳答案 类似于: ORDER BY CASE WHEN
我有一个包含 2 列“id”和“name”的表。 id 是常规的自动增量索引,name 只是 varchar。 id name 1 john 2 mary 3 pop 4 mary 5 j
场景 网站页面有一个带有分页、过滤、排序功能的表格 View 。 表中的数据是从REST API服务器获取的,数据包含数百万条记录。 数据库 REST API 服务器 Web 服务器 浏览器 问
假设我有一本字典,其中的键(单词)和值(分数)如下: GOD 8 DONG 16 DOG 8 XI 21 我想创建一个字典键(单词)的 NSArray,首先按分数排序,然后按字
如何在 sphinx 上通过 sql 命令选择前 20 行按标题 WEIGHT 排序,接下来 20 行按标题 ASC 排序(总共 40 个结果),但不要给出重复的标题输出。 我尝试了这个 sql 命令
我有一个奇怪的问题,当从 SQLite 数据库中选择信息并根据日期排序时,返回的结果无效。 我的SQL语句是这样的: Select pk from usersDates order by dateti
我是一名优秀的程序员,十分优秀!