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

时间:2015-07-10 02:17:42

标签: c++ algorithm big-o time-complexity heapsort

以下是算法:

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符号和时间复杂度,所以我只是想确保我正确理解它。

1 个答案:

答案 0 :(得分:3)

您的分析是正确的。

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

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

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

相关问题