基数排序 - O(n)时间

时间:2014-03-19 01:12:02

标签: algorithm sorting big-o time-complexity radix-sort

我听说如果我们正在排序n个数字并且正在排序的数字被转换为基数n,那么可以在O(n)时间内执行基数排序。

我做对了吗?

如果是这样,这究竟是如何实现的。如果我们处理5个数字并将它们全部转换为5,我们可以将数字分成5个桶(0,1,2,3,4)。

即使我们处理的数字最多只有7位数,你是否还需要至少循环7 * 5次......?这似乎不对。但是。

对不起,对此感到困惑。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

基数排序的工作原理是选择一些数字基数b,将所有数字写入基数b的输入中,然后一次对数字进行排序。在这个答案中,我将重点关注最不重要的数字基数排序,其中我们按最低有效数字排序所有数据,然后是第二最低有效数字等。

每次我们按照某个数字对数字进行排序时,我们必须做O(n)工作以在所有存储桶中分配元素,然后O(n + b)工作以遍历存储桶并获取已排序的元素订购。因此,一轮基数排序的运行时间为O(n + b)。

基数排序的轮数取决于每个数字的位数。如果在基数b中写入数字,则数字M中将有O(log b M)个base-b数字。如果我们让M表示输入数组中的最大数字,则轮数然后,基数排序将为O(log b M)。因此,基数排序的渐近运行时是

  

O(n + b)·O(log b M)= O((n + b)log b M)。

在典型的二进制基数排序中,您选择b = 2并获得O(n log M)的运行时间。但是,您可以选择b作为您想要的任何值。如果你选择一个更大的b值,那么每个数字中的base-b数字将会更少(例如,在base-10中写一个数字然后在base-16中写一个数字;你通常需要更少的数字基-16)。在你原来的问题中,你问了

  

即使我们处理的数字最多只有7位数,你是否还需要至少循环7 * 5次?

答案是“不一定”。如果你使用7位数字进行基数为10的基数排序,那么是的,你必须循环7次。但是,如果使用base-100基数排序,则只需要循环4次。

你的另一个问题是关于使用base-n进行基数排序。如果我们选择我们用作数字n的基数,那么我们得到运行时

  

O((n + n)log n M)= O(n log n M)= O(n log M / log n)

(这使用对数的基础更改公式来重写log n M = log M / log n)。

这是 O(n),你也不应该期待它。可以这样想 - 基数排序的运行时间取决于要排序的字符串的长度。如果对少量非常长的数字进行排序,则运行时必须大于排序少量小数的时间,因为您必须实际读取大数字的数字。使用base n的技巧只是一种渐进地加速算法的技术。

希望这有帮助!