我的堆排序算法时间复杂度分析是不是正确?

Posted

技术标签:

【中文标题】我的堆排序算法时间复杂度分析是不是正确?【英文标题】:Is my heap sort algorithm time complexity analysis correct?我的堆排序算法时间复杂度分析是否正确? 【发布时间】:2015-07-10 02:17:41 【问题描述】:

算法如下:

void heapSort(int * arr, int startIndex, int endIndex)

    minHeap<int> h(endIndex + 1);

    for (int i = 0; i < endIndex + 1; i++)
        h.insert(arr[i]);

    for (int i = 0; i < endIndex + 1; i++)
        arr[i] = h.deleteAndReturnMin();

insert()deleteAndReturnMin() 方法都是 O(log n)。 endIndex + 1 可以称为 n 个元素。因此,鉴于这些信息,我是否正确地说第一个和第二个循环都是 O(n log n),因此整个算法的时间复杂度是 O(n log n)?更准确地说,总时间复杂度是否为 O(2(n log n))(不包括初始化)?我正在学习大 O 表示法和时间复杂度,所以我只是想确保我理解正确。

【问题讨论】:

两者在O(2(n log n))中无意义 对于所有实数 c > 0 的任何 big-oh 复杂度类 O(c * f(n)) = O(f(n))。所以我们会写成 O(nlogn)。跨度> @moreON 谢谢我了解大 O 符号。我只是想确保为了更准确,如果那是正确的? 这个答案解释了原因:***.com/a/22188943/290617 在任何意义上都不是“更准确”。完全一样。 【参考方案1】:

你的分析是正确的。

鉴于您提供的两种方法都是对数时间,您的整个运行时间是对数时间迭代 n 元素 O(n log n) 总计。您还应该意识到,Big-O 表示法忽略了常数因子,因此因子 2 是没有意义的。

请注意,您的代码中存在错误。输入似乎表明数组从startIndex 开始,但startIndex 在实现中被完全忽略。

您可以通过将堆大小更改为endIndex + 1 - startIndex 并从int i = startIndex 循环来解决此问题。

【讨论】:

谢谢你是对的。我没有考虑到能够从特定索引开始排序。

以上是关于我的堆排序算法时间复杂度分析是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章

第3章:搜索排序和复杂度分析

《算法设计与分析》期末不挂科

基于最大堆的堆排序算法

复杂度分析

算法漫游指北(第八篇)插入排序算法描述动图演示代码实现过程分析时间复杂度和希尔排序算法描述动图实现代码实现过程分析时间复杂度

算法漫游指北(第八篇)插入排序算法描述动图演示代码实现过程分析时间复杂度和希尔排序算法描述动图实现代码实现过程分析时间复杂度