我在[17,98,89,42,67,54,89,25,38]中有一个数字列表,它将从左到右插入空堆中。什么是最终的堆?
答案 0 :(得分:0)
尽管这不是堆排序算法(通过使用堆对数据集进行排序),但构建堆确实需要进行一些比较工作以确保其仍然是堆(您想要最大的堆,因此所有子项都更少了)比他们的父母)。生成最大堆的方法是将最新元素放在下一个可用位置(树中最左侧的位置未填充到最深的行中,或者从最左侧的位置开始新的行)。插入元素后,如果它大于其父元素,则将与其父元素交换,直到它成为树的根或找到一个比自身更大的父元素为止。直到插入所有元素,并且实际上以max元素为根,该操作才完成。
重要的是要注意,对于最小堆,最小元素是根,因此与其使所有父母大于其子女,不如使所有父母大于其父母。在构建最小堆时,仍将新顶点添加到同一位置,但是如果子节点小于父节点而不是父节点,则将新子节点与父节点切换。
已附加了两个图像,并带有最大和最小堆。注意,为清楚起见,89a对应于前89,而89b对应于秒。 Max Heap Min Heap