Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 有没有一个好的库可以对C语言中的大数组进行排序?_Sorting_Comparison_Quicksort_Radix Sort - Fatal编程技术网

Sorting 有没有一个好的库可以对C语言中的大数组进行排序?

Sorting 有没有一个好的库可以对C语言中的大数组进行排序?,sorting,comparison,quicksort,radix-sort,Sorting,Comparison,Quicksort,Radix Sort,如果我有一个大的整数或浮点数组,什么是好的算法/ 排序的实现(在C中) 这是一个有点晚在游戏中编辑。。。但是我在寻找正确性和速度。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 &

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

这是一个有点晚在游戏中编辑。。。但是我在寻找正确性和速度。

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;
}
int-cmp\u-int(常数无效*a,常数无效*b)
{
常数int*ia=a;
常数int*ib=b;
如果(*ia<*ib)
返回-1;
如果(*ia>*ib)
返回1;
返回0;
}
整数cmp_浮点(常数无效*a,常数无效*b)
{
常数浮点*fa=a;
常量浮点*fb=b;
如果(*fa<*fb)
返回-1;
如果(*fa>*fb)
返回1;
返回0;
}

(编辑:基于从a中减去b的版本依赖于签名溢出行为,因此这不是一个好主意。)

使用。。。除非你对数字有所了解

您已使用基数排序进行标记。你准备投入多少内存?数字是否在特定范围内?它们是否具有使基数排序可行的特性


除非您想使用大量内存,Q排序是一个不错的选择。

< P>排序数字数组时,考虑基数排序算法。如果设计得当,这些排序应该比GLIBC qsort()提供更好的性能

usort库包含所有主要C数字类型的特定于类型的实现

在我的64位intel笔记本电脑上,对于N=1000000的双精度浮点数,基数排序比GLIBC qsort的速度优势约为2.5倍。然而,随着N的增长,优势应该更大,因为基数排序是一种线性时间算法,需要通过数据的次数恒定



对于非常小的N,相同的代码将分派到introsort或insertion排序

考虑到我们现在获得的大量RAM,下面的设置排序是可能的:在一个巨大的RAM位数组中为每个数字标记位,然后通过扫描RAM来读取它们。大量特定于硬件的优化可应用于标记和扫描阶段。

只有在有密集的、理想连续的数字列表进行排序时,基数排序才有效。如果你有,比如说,一副洗过的牌,效果会很好;如果你有一个可能重复的分散的数字范围,那就不太好了。嗨,约翰,我不明白你的评论。与quicksort/introsort相比,基数排序时间是非常确定的,quicksort/introsort根据数据的统计信息而变化-还有,我认为你的例子是相反的。对于洗牌组,我认为快速排序/导入排序会更快。啊。。。我现在弄糊涂了。对于分类甲板,我希望快速排序更快。但基数排序应该在排序时间上表现出较小的差异。没有真正的理由说明基数排序必须是特定于endian的。例如,如果您使用的是65536个存储桶,那么(NUMBER&65535)将始终为您提供最低有效的16位数字,而不管硬件的端性如何。Endianness只有在通过类型双关指针查看底层表示时才会出现。我发现,只要数组的大小足够大,基数排序就会大大超过qsort。对于这些小情况,分配到基于比较的排序(使用静态比较)可确保针对qsort的一致执行增益。这是usort实施的策略。正如你所建议的。。。内存使用:是原始数组大小的两倍。但是,对于具有足够虚拟RAM的64位计算机,这不会是一个问题。。。对于高度重复或预分类的数据。。。基于比较的排序数据可能是更好的选择。当数组接近二级缓存大小时,它们各自如何执行?这取决于被排序类型的大小。对于有符号的8字节整数,差异是2.5-3倍的范围。非常方便和通用。。。但不是特别快;比较操作不是内联的。我想知道java快速排序(我认为可以使用内联比较)是否比glibc qsort()更具竞争力。另一方面,对于内联比较,我的解决方案中建议的usort库包括一个带有内联比较的通用introsort。比较是由#includer定义的宏定义的,这是通用的。@setjmp。。。然后内联他的解决方案。在C中内联函数并不难,因为C中无法内联函数指针参数;编译器无法确定指针在运行时的值。至少,这是我上次调查时发现的。原则上,C编译器没有理由不注意到对qsort的特定调用总是传递一个常量函数指针,并且在幕后创建一个神奇的qsort()内联版本。不过,我怀疑是否有编译器真正做到了这一点,主要是因为这不太可能值得一试。在任何情况下,非内联比较的开销在快速排序文献中都有提到。。。Bentely和McGilroy的一篇论文“设计排序函数”记录了这一点。USort库还包含测试代码,用于比较introsort与内联比较与GLIBC qsort(使用随机双精度作为输入):{{N introsort(secs)GLIBC(secs)x倍加速10000000 1.6881 2.837 1.68}我相信introsort的优势主要来自内联(直到最近,在我的代码中,introsort才取代了quicksort)-1因为根据你的评论,你真的不应该问这个问题。faq表明这是公司创始人欢迎的…虽然它也指出这会激怒一些用户。但是,我真的希望通过这样做能学到一些东西。例如,如果其他人遇到了为每一个问题定制/优化排序的麻烦e-C数字