有一个很好的库可以在C中对大量数字进行排序吗?

时间:2009-07-23 03:08:55

标签: sorting comparison quicksort radix-sort

如果我有大量的整数或浮点数,那么什么是好的算法/ 排序实现(在C中)?

游戏中的编辑有点晚了...但我正在寻找正确性和速度

4 个答案:

答案 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将其读回。可以对标记和扫描阶段应用许多特定于硬件的优化。