Performance 为什么堆排序是有效的?

Performance 为什么堆排序是有效的?,performance,sorting,heapsort,Performance,Sorting,Heapsort,我们今天刚在课堂上学习了堆排序,我很困惑它是如何被认为是如此高效的——比如有O(nlogn) 它的内存效率不高,因为您必须构建一个表示整个数组的堆并不断修改它 它的计算效率不高,因为每次都必须找到最大值并将其带到根 我可能只是不太了解堆,但这似乎是一种非常迂回的选择排序方法,但不知何故,它被认为更有效。。。为什么会这样 它的内存效率不高,因为必须构建一个表示整个数组的堆 堆排序所基于的“中心技巧”(没有它可能就不相关)是,数组可以在适当的位置进行堆化(这可以在中完成),然后堆一直保持在数组的

我们今天刚在课堂上学习了堆排序,我很困惑它是如何被认为是如此高效的——比如有O(nlogn)

  • 它的内存效率不高,因为您必须构建一个表示整个数组的堆并不断修改它
  • 它的计算效率不高,因为每次都必须找到最大值并将其带到根
我可能只是不太了解堆,但这似乎是一种非常迂回的选择排序方法,但不知何故,它被认为更有效。。。为什么会这样

它的内存效率不高,因为必须构建一个表示整个数组的堆

堆排序所基于的“中心技巧”(没有它可能就不相关)是,数组可以在适当的位置进行堆化(这可以在中完成),然后堆一直保持在数组的开头,随着数组末尾排序项范围的增加而同步缩小。整个算法可以在没有分配和递归的情况下进行:O(1)内存开销

它的计算效率不高,因为每次都必须找到最大值并将其带到根


没有搜索。可以将任何项放到根目录中,然后“冒泡”以恢复heap属性。最明显的选择是堆中的最后一个项,它很容易移除(它不会在堆中留下“洞”,只会将大小减小1)。它与数组中要放置旧根的值的位置相同,因此无论如何,该项最好不要挡道。

您可以添加heapify可以在O(N)中完成。