首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效的排序?

高效的排序?
EN

Stack Overflow用户
提问于 2011-02-22 03:09:33
回答 4查看 3K关注 0票数 0

我寻找这个问题的答案已经有一段时间了。“对一百万个32位整数进行排序的最有效方法是什么?”

我觉得快速排序在排序中是最有效的。平均运行时间为O(n*log )。(最坏情况为O(n²))..

但一些搜索结果表明,基数排序/合并排序对于排序百万个整数是有效的。

有什么建议吗?

EN

回答 4

Stack Overflow用户

发布于 2011-02-22 03:16:29

Mergesort保证为O(n lg n),但比快速排序具有更高的内存占用。

快速排序通常比合并排序运行得更快,但在某些情况下,它可能会降级为二次运行时间。

基数排序是O(n*r),其中r是数字的长度。

要确定基数是否比您选择的lg-n方法更好,请执行以下操作:

代码语言:javascript
复制
n * r < n * lg (n)
divide by n on both sides
r < lg(n)

We know r is 32 bits

32 < lg(n)

for both sides, take 2^x

2^32 < 2^(lg(n)

2^32 < n

因此,如果n小于2^32 (40亿),则使用lg-n算法。

就我个人而言,我会使用快速排序,如果有必要的话,我会对它进行混洗,以防止它降级。

票数 3
EN

Stack Overflow用户

发布于 2011-02-22 03:15:48

如果您有足够的空间,也许可以尝试存储桶排序(http://en.wikipedia.org/wiki/Bucket_sort)。它效率更高,但需要额外的内存来存储数据。

票数 1
EN

Stack Overflow用户

发布于 2011-02-22 03:17:43

基数更适合于大数,特别是当你知道这些数的范围时。

计算修复:

基数是O(kN),其中k是最大数的位数。(实际上它是关于d*k*N的,其中d是数字基数,将使用的存储桶数...

Maxint = 4,294,967,296

32位:K= 32 / log(d)

基数10的基数:

代码语言:javascript
复制
d*k*n = 10*10*n < nlogn .... 100 < logn ... n > 2^100  

代码语言:javascript
复制
d*k*n = 2*32*n < nlogn .... 64 < logn ... n > 2^64

因此,对于32位数字,如果你有超过2^64的数字,n*k*Nnlogn更好

但是,如果您知道范围将达到1024,而不是MAXINT,例如:

MaxNumber = 1024

基数10的基数:

代码语言:javascript
复制
d*k*n = 10*4*n < nlogn .... 40 < logn ... n > 2^40 

代码语言:javascript
复制
d*k*n = 2*10*n < nlogn .... 20 < logn ... n > 2^20

因此,对于1024个以上的数字,如果您有超过2^20个数字,则n*k*Nnlogn更好

由于大O表示法在运行时间上丢弃了乘法常量,并且忽略了低输入大小的效率,因此它并不总是在实践中或对于实际大小的数据集显示最快的算法,但当输入大小变大时,该方法仍然非常有效地比较各种算法的可扩展性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5070120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档