当所有值都在1到k的范围内时,我们能否为基于比较的算法的O(n lg n)运行时间做得更好,其中k <1。 Ñ
计算排序和基数排序不是基于比较的算法,不允许使用。通过决策树分析,似乎存在k ^ n个可能的排列。有2 ^ h个叶子,因此应该可以用基于比较的排序算法来解决O(n lg k)时间中的问题。
请不要给出基于非比较的排序算法来解决这个问题,所有排序必须基于两个元素之间的比较。谢谢!
答案 0 :(得分:8)
可以在您指定的范围内轻松完成。构建k叶的二叉树并在每个叶上包含计数值。如果使用合适的平衡算法,处理每个元素(添加它或计算计数)将是O(lg k),因此所有这些元素都将是O(n lg k)。重新构成列表将是O(n)。
答案 1 :(得分:4)
好的,如果你坚持要比较。
您有 k 元素。因此,保留一个可以容纳所有元素的树结构。
浏览项目列表,每次都将项目添加到树中。如果项目已在树中,则只需递增该节点中的计数器。 (或者如果你想要实际的项目,你可以在每个节点中保留一个列表)
树只有 k 项。
最后,以顺序方式遍历树,并以正确的顺序添加项目(同时添加节点计数器中的数量)。
复杂性: O(nlogk)
答案 2 :(得分:0)
是的,您可以使用大小为k的数组。 (没有比较)
每个单元格我都会包含一个列表 翻看原始数组,将每个项目放在右侧单元格的列表中。
浏览第二个数组,将它们拉出来,按正确的顺序将它们放回去。
<强> O(n)的强>