以下是算法:
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符号和时间复杂度,所以我只是想确保我正确理解它。
答案 0 :(得分:3)
您的分析是正确的。
鉴于您提供的两种方法是对数时间,您的整个运行时间是在n
元素O(n log n)总计上迭代的对数时间。您还应该意识到Big-O表示法忽略了常数因子,因此2的因子是没有意义的。
请注意,您的代码中存在错误。输入似乎表明数组从startIndex
开始,但在实现中完全忽略startIndex
。
您可以通过将堆的大小更改为endIndex + 1 - startIndex
并从int i = startIndex
循环来解决此问题。