O(N)排序算法

时间:2013-03-22 00:44:08

标签: java algorithm sorting

给定一个大小为100的未排序值数组(列表有100个元素),和 每个值都是从[0 ... 1000]的范围中随机抽取的。设计一个 算法在线性时间内对给定列表进行排序(即O(N)最坏情况性能)。

提示:利用事先知道值范围(即从1到1000)的事实

这是我班级的硬件问题之一。他想要一个执行上述功能的伪代码。我只是想不出一个具有O(N)最坏情况性能的功能。

P.S。 - 它不应该像Radix排序那样复杂。 P.S.S - 我只是想知道如何做到这一点的想法。不找人做我的作业。

这是在java btw。

谢谢!

6 个答案:

答案 0 :(得分:6)

看看bitmap sort。它的工作原理是将一组未排序的值用作数组中的索引,并在O(N)时间内运行。

答案 1 :(得分:4)

我相信你要找的是Counting Sort。您可以跟踪每个号码发生的次数,然后只需按顺序打印它们。

答案 2 :(得分:0)

尼克是正确的(给他信任 - 我只回答,因为它不适合评论栏。)

您将定义一个阵列,其中1,001个元素全部初始化为零。您一次读取一个100个值,递增与您正在读取的值具有相同索引的数组元素。执行此操作100次后,您将拥有1,001个元素的数组(大部分仍然为零),您只需按第0个数组元素中的值指定的次数打印数字0,然后将数字1打印多次由第一个数组元素中的值等指定。这听起来很慢,但由于它是一个O(n)算法,它比任何其他排序方法更快,但只有你知道输入是范围内的所有整数才有效0到1,000(总共1,001种可能性)。

答案 3 :(得分:0)

是的,“计数排序”将是O(n)+ O(N)(其中n = 100& N = 1000)。但是像所有声称优于n log(n)的方案一样,它“欺骗”,因为当你考虑扩展内存的成本时,O(N)组件实际上是N log N组件 - 内存性能是将N记录到内存大小。只是,对于所讨论的特定处理器,内存大小是固定的,因此日志N因子被掩埋。

答案 4 :(得分:0)

这通常是他们在您的第一个算法类中教给您的算法:http://en.wikipedia.org/wiki/Radix_sort

答案 5 :(得分:0)

在这种情况下计数排序的成本似乎是O(N + Nsqrt(N))= O(N ^ 3/2)。我认为使用radix_sort可以改善这种情况,正如@Daniel_Williams告诉我们的那样。例如,参见麻省理工学院开放课程的第5讲https://www.youtube.com/watch?v=0VqawRl3Xzs