所有类别的线性时间排序

时间:2012-10-14 03:21:22

标签: algorithm sorting

我有这个可能是愚蠢的想法

因为我们使用线性时间排序算法来处理受约束的类别,例如使用计数排序,基数排序的整数。

与计算机一样,所有类型的数字类型最终都以字节顺序编码(在某种程度上类似于整数等...)。是否能够说明我们可以使用线性时间排序算法对所有这些数字进行线性时间排序?

2 个答案:

答案 0 :(得分:1)

当然,虽然细节因类型而异。一个简单的例子是IEEE-754浮点值(32位和64位),它们几乎可以像整数一样进行排序。 (更具体地说,它们可以按照符号整数整数进行排序。)因此基数排序可以正常工作。

对于字符串,当你有太多的内容适合内存时,一种非常罕见的技术是通过前缀“bin”它们,这是各种基数排序。

对于短位域值(如整数或如上所述,浮点数),从左到右的一次性基数排序实际上只是quicksort的变体,因为它基本上只是找到合理的枢轴的方法。与quicksort不同,它保证了有限的递归深度(在32位值的情况下为32)。另一方面,quicksort通常具有小得多的递归深度,因为数据集大小的log 2 通常远小于32。

快速排序的主要优点是您可以编写算法(STL样式),而不知道任何有关正在排序的数据类型的内容,除了如何调用函数来比较两个值。基数排序同样不能说;制作通用版本要困难得多。

编辑添加一个重点:

过分强调O(n)和O(n log n)之间的差异是很常见的。对于非常大的,它们是不同的。但对于大多数现实世界中非Google大小的问题,log n是一个小整数。使用O(n)算法是没有意义的,当有一个O(n log n)算法需要2n log 2 n秒时需要100n秒,除非log n大于50,也就是说n大于1,125,899,906,842,624。

答案 1 :(得分:0)

不,你不能。如果您有一个由以下字节表示的数据:

11001100 00110011
(204)    (51)

如果你要使用像radix sort这样的东西对它们进行排序,你会得到:

00110011 11001100
(51)     (204)

唯一的问题是,不再是您写入磁盘的数据,它是一个完全不同的数据,甚至可能根本没有任何意义(垃圾)