有一天,我正在阅读有关谷歌和微软实习面试的博客,我读到其中一个问题是如何在线性时间内订购整数数组。
我认为订购东西的最佳方式是O(n log(n)),如Mergesort或Quicksort,但知道我不确定。有什么想法吗?
答案 0 :(得分:2)
嗯,问题肯定有一些限制。例如,如果数组只包含少量重复数字[1 3 2 6 3 1 2]
,您可以使用counting sort
在线性时间内执行此操作,但它会占用更多空间。
您可以注意的另一种算法是Dutch National Flag
算法,该算法可以在线性时间内对3个重复数进行排序。除此之外,我不认为(这里的无知不是幸福:P)我知道一种在线性时间内对正常数组进行排序的方法。
即使您使用Radix sort
,也会占用O(m * n)
,但如果m <<< n
您可以认为其大约O(n)
答案 1 :(得分:2)
O(n lg n)
是您为基于比较的排序所能做的最好的事情,除了您如何比较之外,您不需要了解任何有关您正在排序的项目的信息。 。对有界大小的整数列表进行排序(即,每个整数最多为K
,其中K
独立于n
)是一个更专业的问题,因此您可以使用更专业的运行速度超过O(n lg n)
的算法(例如基数排序)。