我重新访问了插入排序算法并发现了一些有趣的内容。
显然不应该使用这种类型的数组,因为在插入时,必须移动所有后续元素 O(n ^ 2 log(n))。但是链接列表在这里也不是很好,因为我们最好使用二进制搜索找到正确的位置,这对于简单的链表是不可能的(所以我们最终得到 O(n ^ 2))。
这让我想知道:这个排序算法在哪个数据结构中提供了 O(nlog(n))复杂性的前提?
答案 0 :(得分:2)
从哪里获得 O(n log n)的前提? Wikipedia disagrees,和我自己的经历一样。插入排序的前提包括每个n
元素 O(n)的组件。
此外,我认为您对 O(n ^ 2 log n)的主张不正确。二进制搜索是 log n ,随后的“侧向移动”是 n ,但这两个步骤是连续的,而不是嵌套的。结果是 n + log n ,而不是乘法。结果是预期的 O(n ^ 2)。
答案 1 :(得分:1)
如果您使用有间隙的数组和二进制搜索来确定插入内容的位置,那么很有可能您的排序为O(n log(n))
。有关详细信息,请参阅https://en.wikipedia.org/wiki/Library_sort。
然而,这并不像广泛实施的各种其他种类那样有效。所以这些知识只是理论上的兴趣。
答案 2 :(得分:1)
插入排序是在数组或列表上定义的,如果使用其他数据结构,那么它将是另一种算法。
当然如果你使用BST,插入和搜索将是O(log(n)),你的整体复杂度平均为O(n.log(n))(提醒它将是O(n) ^ 2)在最糟糕的情况下),但这不再是插入排序,而是树排序。如果使用AVL树,则会得到O(n.log(n))最坏情况的复杂性。
答案 3 :(得分:0)
在插入排序中,最佳情况是当序列已经排序并且需要线性时间时,在最坏的情况下需要 O(n ^ 2)时间。我不知道你是如何得到复杂性的对数部分的。