C++ 200-300位整数的最快整数排序实现?

C++ 200-300位整数的最快整数排序实现?,c++,c,sorting,integer,C++,C,Sorting,Integer,对于200-300位大小的整数,最快的整数排序实现是什么?精确的整数大小是固定的;我有高达2G的整数(全部在RAM中) 我听说可以在O(n log log M)或甚至O(n sqrt(log log M))时间对这样的集合进行平均排序,其中n是整数的数量,M是最大的整数。内存使用是有限的(我可能会额外使用高达0.5-1 GB的内存)。可就地进行分拣;在中可能不稳定(重新排列DUP) 是否有此类排序方法的C/C++实现,例如Han&Thorup(2002)?如果内存使用确实受到限制。我将分离每个字

对于200-300位大小的整数,最快的整数排序实现是什么?精确的整数大小是固定的;我有高达2G的整数(全部在RAM中)

我听说可以在O(n log log M)或甚至O(n sqrt(log log M))时间对这样的集合进行平均排序,其中n是整数的数量,M是最大的整数。内存使用是有限的(我可能会额外使用高达0.5-1 GB的内存)。可就地进行分拣;在中可能不稳定(重新排列DUP)


是否有此类排序方法的C/C++实现,例如Han&Thorup(2002)?

如果内存使用确实受到限制。我将分离每个字节,并将它们存储到一个从最高有效字节到最低有效字节的trie数据结构中。如果按排序顺序插入字节,则可以迭代trie并对所有数据进行排序。

我认为最合理的做法是创建指向bigint的指针数组,并对指针数组进行排序。我建议使用某种模板化的快速排序,带有智能比较功能

比较函数应该能够在大多数情况下通过查看最重要的4个字节来确定。如果它们不匹配,则决定进行比较。如果它们匹配,则查看接下来的4个字节,直到int结束


我猜数据范围可能足够大,基数排序是不切实际的。如果数据是随机的,则快速排序通常足够快,并且具有优于大多数非基数排序的缓存性能。

A可用于使用固定大小的键对数据进行排序。由于这一条件不经常满足,因此对该技术的讨论不多,但在计算出密钥大小时,它可以是O(n)。

签名排序适用于具有“O(n lg n)”预期时间复杂度的大词,但对于小词,您可以获得与von Emde Boas排序相同的复杂度。最近,Han和Thorup发布了更快的排序算法,预计时间复杂度为“O(n sqrt(lg n))”。我不确定你是否能在网上找到这些算法的实现,但可能有一些关于麻省理工学院和哈佛大学的优秀文章和讲座。

ints是随机的吗?是否有任何内部模式可能会有所帮助?这是两个问题:一个有效的大整数比较和一个快速排序函数。有很多关于快速排序算法的评估。。。你需要找到一个快速的比较。它们不是随机的,而是相当大的。我想测试更快的基于签名的方法或基于van Emde Boas树的方法,如“Han&Thorup 2002”。我有,但我想得到完整的实现。一个300位大小的整数?也许您还应该担心排序算法会占用多少内存。有些算法在适当的位置工作得很好,有些则不行。从内存使用率和缓存位置(我认为对于如此大量的数据来说非常重要)的角度来看,我敢打赌MSD递归基数排序是最有效的。什么是时间复杂性?需要多少内存?这取决于键的相似程度以及每个字节使用的排序算法。维基百科的文章将比我更好地解释它的优势。。如果您对指针进行排序,我认为您很可能会遇到一些严重的缓存局部性问题,因为您仍然需要随机访问2Gb来执行比较。但是,当您进行非本地交换(您希望尽量减少交换的数量)时,您在所有情况下都会遇到2Gb的缓存局部性问题。但通过点的间接定向,您至少可以避免交换时的大量复制。@g&f。是的,但是。。。。每件事都会有缓存问题。快速排序最终达到缓存有效的程度。很多其他类型的都没有。它是O(nm),其中
m
是最大整数的大小(即位数)。在我正确阅读问题之前,这也是我的答案。OP已经提到了一些方法,这些方法的渐近运行时间优于基数排序(对于m位值,O(n logm)或O(n sqrt(logm))而不是O(n m)。基数排序可能仍然会因为实际原因而获胜,但您没有提到任何一个。@John,OP提到了一个普通公众无法评估的算法,因为它在付费墙后面。谷歌在维基百科上找到了这个宝石,但仍然没有详细的算法描述:就复杂度而言,它们都是O(n),根据密钥长度使用不同的常量乘数。实际花费的时间将取决于代码的复杂性,正如键的理论切片一样。@Mark:我完全同意实际运行时间将在很大程度上取决于实现因素,事实上,我认为这非常重要,可以包含在您的答案中。然而,仅仅告诉那些已经知道排序可以在O(n)时间内完成的人基数排序可以在O(n)时间内完成排序并没有什么好处。这是基于这样一种假设(可能是错误的),即在调查了足够多的资料后,发现了韩和索洛普,OP也会遇到(比较有名的)基数排序。@Mark:至于薪酬墙,我必须承认我没有想到,因为我很幸运能够通过我的大学进入。然而,在这种情况下,该文件也可从。