我正在尝试确定Big O中合并排序的运行时间:
(A)分类输入
(B)反向排序的输入
(C)随机输入
我的回答是,对于所有三种情况都需要O(n lgn),因为无论输入的默认顺序如何,合并排序总是将输入分成1个元素的最小单位。然后,它将每个元素与相邻列表中的每个元素进行比较,以对两个相邻列表进行排序和合并。它将继续这样做,直到最后所有元素都被排序和合并。
那就是说,我们真正需要找到的只是合并排序的Big O复杂性,因为最糟糕的,平均的和最好的情况都会花费相同的时间。
我的问题是,有人可以告诉我我的答案是否正确,如果是,请解释为什么合并排序的Big O复杂性最终为O(n lgn)?
答案 0 :(得分:2)
这个问题的答案取决于你的Merge Sort的实现。 当天真地实现时,合并排序确实使用O(n * log n)时间,因为它总是将输入分成最小单位。但是,有一个称为自然合并排序的特定实现,如果它们已经在输入数组中已经按照基本上先查看给定输入和决定的顺序排列,它们将保持正确的顺序哪些部分需要订购,即分割,然后再合并。
自然合并排序对于有序输入仅需要O(n)时间,并且对于随机输入通常比对反向排序输入更快。在后两种情况下,运行时将为O(n * log n)。
要回答你的上一个问题,我会看看"正常"归并;这种解释更容易。
请注意,Mergesort可以显示为二叉树,其中在根中我们有整个输入,在下一层,您从分割输入一次得到的两半,在第三层我们有四个季度,依此类推。 ..在最后一层,我们终于有了个别数字。
然后注意整个树是O(log n)深(这也可以用数学证明)。在每一层,我们必须对n个数字进行一些比较和交换 - 这是因为当我们走下树时,图层上的数字总量不会减少。在图片中,我们需要对每层上的8个数字进行比较和交换。 Mergesort的工作方式,我们实际上必须进行完全 8次比较,最多每层8次交换。如果我们有一个长度为n而不是8的输入,我们需要进行n次比较,每层最多n次交换(这是O(n))。我们有O(log n)层,因此整个运行时将是O(n * log n)。