如果我有一个大阵列的整数或浮点数的,什么是好的算法/ 实施(在C)排序?

这是一个有点晚在游戏中的编辑......但我期待的正确性和速度的。

有帮助吗?

解决方案 2

有关排序号码的阵列,可以考虑一个基数排序算法。当适当地设计,这些种类的应提供比GLIBC的qsort()更好的性能。

在usort库包含所有主要Ç数字类型特定类型的实施方式。

http://bitbucket.org/ais/usort/wiki/Home

基数排序过的qsort GLIBC的速度优势是用于双精度在N =百万在我的64位Intel膝上型浮点数约2.5倍。然而,由于基数排序是通过数据需要遍恒定数目的线性时间算法如N生长的优点应该更大。

对于非常小的N,相同的代码分派给一个或内省排序插入排序。

其他提示

的qsort()从标准库是一个good'un。

在比较函数将对于这些情况是微不足道的:

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;
}

(编辑:这些证书的版本的基础上减去b。从一个依赖于符号溢出的行为,所以它不是一个好主意)

这是从来没有一个坏主意,使用的qsort ...除非你知道一些有关的数字。

您已经标记为基数排序。多少内存,你准备投资?在特定范围内的数字?他们有使基数分拣可行?属性

除非你要使用大量的内存,快速排序是一个很好的选择。

由于巨大的RAM我们来说没什么大不了,下面的一组排序是可能的量:标志着一个巨大的RAM位阵列为每个拥有数位,然后通过扫描RAM读取它们赶走了。的特定于硬件的优化许多可应用于该标记和扫描阶段。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top