我正在尝试对具有
等属性的数组进行排序它会在某种程度上增加,然后开始减少,然后增加然后减少,依此类推。是否有任何算法可以通过使用部分排序来对nlog(n)复杂度进行排序?
数组示例= 14,19,34,56,36,22,20,7,45,56,50,32,31,45 ......... upto n
提前致谢
答案 0 :(得分:2)
您可以找到更改/分区点,并在分区对之间执行合并排序。这将利用现有的排序,因为通常合并排序以元素对开始。
编辑只是想在这里找出复杂性。合并排序是n log(n),其中log(n)与您必须重新分区的次数有关。首先是每对元素,然后是每对元素等......直到达到数组的大小。在这种情况下,你有n个元素与p分区,其中p < n,所以我猜测复杂性是p log(p),但我愿意纠正。例如合并每对分区,并在合并后基于分区数量的一半重复。
答案 1 :(得分:2)
任何数字序列都会上下和上下移动等等,除非它们已经完全排序(当然可以从下降开始)。你可以通过序列注意它改变方向的点,然后合并 - 排序序列(反向读取后向序列)
一般来说,复杂度是N log N,因为我们不知道此时它是如何排序的。如果它的分类中等,即方向变化较少,则需要较少的比较。
答案 2 :(得分:1)
答案 3 :(得分:1)
如果您知道数据“几乎已排序”并且设置的大小相当小(比如一个可以用16位整数索引的数组),那么Shell可能是您最好的打赌。是的,它的基本时间复杂度为O(n ^ 2)(可以通过用于间隙大小的序列减少到当前最差情况下的O(n * log ^ 2(n))),但是在已排序的集合上,输入的排序设置为O(n)的最佳情况,性能得到改善。使用Sedgewick的间隙大小序列将在输入未按预期排序的情况下提供最佳性能。
答案 4 :(得分:1)
Strand Sort可能接近您正在寻找的内容。 O(n sqrt(n))在平均情况下,O(n)最佳情况(列表已经排序),O(n ^ 2)最坏情况(列表以相反顺序排序)。
分享并享受。