合并mergeSort和heapsort的算法的运行时间是多少?

时间:2019-03-31 14:57:52

标签: algorithm sorting mergesort heapsort

我遇到了这个问题,要求计算与mergeSort完全一样的算法的最坏情况运行时间,但是两个递归调用之一被Heapsort代替。

因此,我知道在mergesort中进行划分需要固定的时间,并且合并为O(n)。堆排序为O(nlogn)。 这是我想出的:T(n)= 2T(n / 2)+ O((n / 2)logn)+ O(n)。 我对O((n / 2)logn)部分有疑问。是n还是n / 2?我写了n / 2,因为我只对数组的一半做堆排序,但是我不确定那是正确的

2 个答案:

答案 0 :(得分:0)

该问题询问运行时间,但是否应该询问时间复杂性?

由于提到了递归,所以这是关于自上而下的合并排序(而不是自下而上的合并排序)的问题。

使用如上所述编写的代码,由于堆排序不是递归的,因此递归仅发生在每个拆分子数组之一上。将调用堆排序对大小为n / 2,n / 4,n / 8,n / 16,...的子数组进行排序,并且直到大小为1的两个子数组成为结果时,才会进行合并递归拆分。在简单的情况下,如果数组大小是2的幂,那么“合并排序”仅用于单个元素,其余子数组的大小为{1,2,4,8,...,n / 8,n / 4,n / 2}通过堆排序进行排序,然后合并。

由于堆排序比合并排序慢,因此运行时间会更长,但是时间复杂度保持在O(n log(n)),因为时间复杂度会忽略常量或较低项因素。

答案 1 :(得分:0)

让我们弄清楚这种情况下的重复关系。在这里,我们

  • 将数组分成两半
  • 递归排序一半(T(n / 2)),
  • 对一半(O(n log n))进行堆排序,然后
  • 将两个半部分合并在一起(O(n))。

这给了我们这种重复关系:

  

T(n)= T(n / 2)+ O(n log n)。

为什么这个O(n log n)而不是O((n / 2)log(n / 2))?原因是big-O表示法会增加常数因子,因此O(n log n)表示与O((n / 2)log(n / 2))相同的渐近增长率。为什么在T(n / 2)上没有2的系数?这是因为我们只进行一次递归调用;请记住,另一个调用已由heapsort替换。

现在剩下要做的就是解决这种重复发生的情况。确实可以算出O(n log n),我将它留给您来决定如何显示。此处的迭代方法是一个不错的选择。