高效排序?

时间:2011-02-21 19:09:33

标签: sorting

我现在一直在寻找这个问题的答案......“对一百万个32位整数进行排序的最有效方法是什么?”

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

但是一些搜索结果表明Radix sort / Merge排序对于排序百万整数是有效的。

任何指针?

4 个答案:

答案 0 :(得分:3)

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

Quicksort通常比mergesort运行得更快,但在某些情况下它会降低到二次运行时间。

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

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

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算法。

就个人而言,我会使用快速排序,如果必须的话,将其改组以防止它降级。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果对于大数字,Radix会更好,特别是当您知道数字的范围时。

计算修正:

基数 O(kN)其中 k 是最大数字中的位数。 (实际上它是关于 d * k * N ,其中 d 是数字基数,将使用的桶数... Alphabet = 26,decimal = 10,binary = 2)

Maxint = 4,294,967,296
32位:k = 32 / log(d)

基础10基数:

d*k*n = 10*10*n < nlogn .... 100 < logn ... n > 2^100  

Base 2 Radix:

d*k*n = 2*32*n < nlogn .... 64 < logn ... n > 2^64

对于32位数字,如果你有超过2 ^ 64个数字 n * k * N 优于 nlogn

但是,如果您知道范围最多为1024,而不是MAXINT,例如:

MaxNumber = 1024

基础10基数:

d*k*n = 10*4*n < nlogn .... 40 < logn ... n > 2^40 

Base 2 Radix:

d*k*n = 2*10*n < nlogn .... 20 < logn ... n > 2^20

对于数字高达1024,如果你有超过2 ^ 20个数字 n * k * N 优于 nlogn

  

因为大O符号丢弃   乘法上的乘法常数   运行时间,而忽略了效率   对于低输入尺寸,它没有   总是揭示最快的算法   练习或实际大小的数据   套,但方法仍然很好   有效的比较   各种算法的可扩展性   输入大小变大。

答案 3 :(得分:0)

在最坏的情况下,合并排序是O(n log n),所以它在大多数情况下比快速排序更好。 Radix排序,iirc,只有在每个被排序的东西长度相同时才真正有用。其时间为O(K * N),即(项目长度)*(项目数)。我认为我不需要使用Radix排序。