我手头有一份排序清单。现在我在列表的末尾添加一个新元素。哪种排序算法适合这种情况?
当列表已经排序时,快速排序的最坏情况时间复杂度为O(n 2 )。如果在上述情况下使用快速排序将接近O(n 2 ),这是否意味着时间复杂度?
答案 0 :(得分:4)
如果您只添加一个元素,请找到应插入的位置并将其放在那里。对于数组,可以进行二进制搜索O(logN)时间并插入O(N)。对于链表,您必须进行线性搜索,这将花费O(N)时间,然后插入为O(1)。
关于quicksort的问题:如果你选择第一个值作为你的支点,那么在你的情况下它是O(N 2 )。选择一个随机数据透视表,你的案例平均仍为O(NlogN)。但是,我在上面建议的方法更容易实现,并且在特定情况下更快。
答案 1 :(得分:2)
这取决于底层列表的实现。 在我看来,插入排序将满足您的需要,除了列表实现为数组列表的情况。在这种情况下,将需要太多的动作。
答案 2 :(得分:2)
您应该执行insert
操作,而不是附加到列表的末尾。
也就是说,将5
添加到[1,2,3,4,7,8,9]
时,您希望通过将其放置在排序列表中的“插入”位置,而不是在结尾然后重新排序整个清单。
您可以使用binary search快速找到要插入项目的位置。
这基本上是insertion sort的工作原理,除了它在整个列表上运行。对于单个项目,此方法将具有比甚至最佳排序算法更好的性能。它可能比在列表末尾附加更快,具体取决于您的实现。
答案 3 :(得分:1)
我假设你正在使用一个数组,因为你谈的是quicksort,所以只需添加一个元素就可以找到插入它的位置(O(log n))然后实际插入它(O(n) )总成本为O(n)。只需将其附加到最后,然后使用整个列表绝对是错误的方法。
但是,如果这是一个频繁的操作(即如果你必须在保持排序属性的同时继续添加元素),则会产生向列表中添加另外n个元素的O(n ^ 2)成本。如果将表示更改为平衡二叉树,则对于另外n个插入将其降至O(n log n),但按索引查找元素将变为O(n)。如果你永远不需要这样做,只是按顺序遍历元素,树绝对是你要走的路。
可能感兴趣的是indexable skiplist,对于轻微的存储成本,它具有O(log n)插入,删除,搜索和按索引查找。看看它,它可能就是你在这里寻找的东西。
答案 4 :(得分:1)
“list”到底是什么意思?你是指具体的链表,还是像阵列一样的线性(顺序)数据结构?
如果是链接列表,则需要线性搜索正确的位置。插入本身可以在恒定的时间内完成。
如果它像数组一样,你可以添加到最后并排序,如你所提到的。如果Quicksort 真的严重实施,则排序集合仅对Quicksort不利。如果选择典型中值为3算法的数据透视表,则排序列表将提供最佳性能。