由于堆是二叉树和数组的组合,排序时整个堆是否保留完整树的形式?
对于家庭作业,我必须追踪排序的每一步的堆和数组,并且我不确定树的表示。
答案 0 :(得分:3)
堆总是一个完全平衡的完全填充的树,它遵循堆不变量 - 对于最小堆,节点的值总是大于或等于其每个子节点的值。
Heapsort用未排序的数据(O(n)时间)创建一个堆,然后重复删除堆的顶部元素(O(lg n)时间,因为必须在每次删除时保持堆)并将其放入数组。值得注意的是,这只有在保持堆不变的情况下才有效 - 除了其他亮点之外,还需要完美的平衡和有效的树。
二叉树不是堆的最有效表示; the Wikipedia article on binary heaps非常好地解释了如何使用数组来表示一个数组。 The article on Heapsort提到了一个有用的细节:你可以通过使用堆末尾的空间来排序,如果使用数组表示,来构建你的输出数组,因为堆总是平衡并最终删除一个元素释放代表堆的数组的物理最后一个单元格。