如果我有大量的整数或浮点数,那么什么是好的算法/ 排序实现(在C中)?
游戏中的编辑有点晚了...但我正在寻找正确性和速度。
答案 0 :(得分:4)
来自标准库的qsort()是一个很好的。
对于这些情况,比较函数将是微不足道的:
int cmp_int(const void *a, const void *b)
{
const int *ia = a;
const int *ib = b;
if (*ia < *ib)
return -1;
if (*ia > *ib)
return 1;
return 0;
}
int cmp_float(const void *a, const void *b)
{
const float *fa = a;
const float *fb = b;
if (*fa < *fb)
return -1;
if (*fa > *fb)
return 1;
return 0;
}
(编辑:这些基于从a减去b的版本依赖于签名溢出行为,所以这不是一个好主意。)
答案 1 :(得分:2)
对于数字数组,请考虑基数排序算法。如果设计得当,这些排序应提供比GLIBC qsort()更好的性能。
usort库包含所有主要C数字类型的特定于类型的实现。
http://bitbucket.org/ais/usort/wiki/Home
基于GLIBC qsort的基数排序的速度优势对于我的64位英特尔笔记本电脑上N = 1000000的双精度浮点数约为2.5倍。然而,随着N的增长,优势应该更大,因为基数排序是一种线性时间算法,需要通过数据的常数次数。
对于非常小的N,相同的代码将调度到introsort或插入排序。
答案 2 :(得分:0)
使用qsort并不是一个坏主意......除非你对数字有所了解。
您已使用基数排序进行了标记。你准备投入多少记忆?数字是否在特定范围内?他们是否具有使基数分类可行的属性?
除非您想要使用大量内存,否则qsort是一个不错的选择。
答案 3 :(得分:0)
鉴于我们现在拥有大量的RAM,可以进行以下设置排序:在每个数字的巨大RAM位数组中标记该位,然后通过扫描RAM将其读回。可以对标记和扫描阶段应用许多特定于硬件的优化。