为什么堆排序高效?
Why is Heap sort efficient?
我们今天刚在 class 学习了堆排序,我很困惑为什么它被认为如此高效 - IE 的复杂度为 O(nlogn)。
- 内存效率不高,因为您必须构建一个代表整个数组的堆并不断修改它。
- 它的计算效率不高,因为您每次都必须找到最大值并将其带到根。
我可能只是不太了解堆,但这似乎是一种非常迂回的选择排序方式,但不知何故它被认为效率更高......为什么会这样?
It's not memory efficient, since you have to build a heap representing the entire array
堆排序所基于的“核心技巧”(没有它它可能不相关)是数组可以堆化就地(这可以是在 linear time) 中完成,然后堆一直停留在数组的开头,随着数组末尾排序项范围的扩大,在锁步中缩小。整个算法可以在没有分配和递归的情况下进行:O(1) 内存开销。
It's not computationally efficient, since you have to find the max every time and bring it to the root.
没有搜索。任何项目都可以放入根中,然后“向下冒泡”以恢复堆 属性。最明显的选择是堆中的最后一项,删除起来很简单(它不会在堆中留下一个“洞”,它只会将大小减小 1)。它与数组中您要放置旧根值的位置相同,因此无论如何最好将此项移开。
我们今天刚在 class 学习了堆排序,我很困惑为什么它被认为如此高效 - IE 的复杂度为 O(nlogn)。
- 内存效率不高,因为您必须构建一个代表整个数组的堆并不断修改它。
- 它的计算效率不高,因为您每次都必须找到最大值并将其带到根。
我可能只是不太了解堆,但这似乎是一种非常迂回的选择排序方式,但不知何故它被认为效率更高......为什么会这样?
It's not memory efficient, since you have to build a heap representing the entire array
堆排序所基于的“核心技巧”(没有它它可能不相关)是数组可以堆化就地(这可以是在 linear time) 中完成,然后堆一直停留在数组的开头,随着数组末尾排序项范围的扩大,在锁步中缩小。整个算法可以在没有分配和递归的情况下进行:O(1) 内存开销。
It's not computationally efficient, since you have to find the max every time and bring it to the root.
没有搜索。任何项目都可以放入根中,然后“向下冒泡”以恢复堆 属性。最明显的选择是堆中的最后一项,删除起来很简单(它不会在堆中留下一个“洞”,它只会将大小减小 1)。它与数组中您要放置旧根值的位置相同,因此无论如何最好将此项移开。