序列3,5,1,9,4,10,2,8,7,6构造的大根堆
时间: 2024-06-14 22:06:16 浏览: 302
以下是构造大根堆的步骤:
1. 从最后一个非叶子节点开始,向上调整每个节点,使其满足大根堆的性质。
2. 对于每个非叶子节点,比较其与左右子节点的大小关系,如果子节点中存在比父节点大的节点,则将父节点与较大的子节点交换位置。
3. 重复步骤2,直到所有非叶子节点都满足大根堆的性质。
根据给定的序列3,5,1,9,4,10,2,8,7,6,我们可以按照上述步骤构造大根堆:
1. 从最后一个非叶子节点开始,即索引为(n/2)-1=4的节点,其中n为序列的长度。该节点的值为4,与其左右子节点9和10比较,发现10最大,因此交换位置,得到序列3,5,1,10,4,9,2,8,7,6。
2. 继续向上调整索引为3的节点,该节点的值为10,与其左右子节点8和7比较,发现10仍然最大,不需要交换位置。
3. 继续向上调整索引为2的节点,该节点的值为1,与其左右子节点3和5比较,发现5最大,因此交换位置,得到序列5,3,1,10,4,9,2,8,7,6。
4. 继续向上调整索引为1的节点,该节点的值为3,与其左右子节点5和4比较,发现5最大,因此交换位置,得到序列5,4,1,10,3,9,2,8,7,6。
5. 继续向上调整索引为0的节点,该节点的值为5,与其左右子节点10和4比较,现10最大,因此交换位置,得到序列10,4,1,5,3,9,2,8,7,6。
最终构造的大根堆为:10,4,9,5,3,1,2,8,7,6。
相关问题
. 已知关键字序列为{2,7,4,3,1,9,10,5,6,8},采用堆排序法对该序列作升序排序时,构造的大根堆是?为什么?
在堆排序算法中,我们需要先构造一个大根堆,然后每次取出堆顶元素(即最大值),将其放到数组的末尾,然后将剩余的元素重新构造成一个大根堆。重复这个过程直到所有元素都被取出。
对于给定的关键字序列{2,7,4,3,1,9,10,5,6,8},我们可以通过以下步骤构造大根堆:
1. 将序列转化为完全二叉树:
2
/ \
7 4
/ \ / \
3 1 9 10
/ \ /
5 6 8
2. 从最后一个非叶子节点开始,依次向上调整每个节点,使得以该节点为根节点的子树成为大根堆。最后一个非叶子节点是节点7,因此我们需要依次向上调整节点7、节点4和节点2。
调整节点7:
2
/ \
7 4
/ \ / \
3 1 10 9 -> 2, 7, 10, 3, 1, 4, 9, 5, 6, 8
/ \ /
5 6 8
调整节点4:
2
/ \
10 7
/ \ / \
3 1 9 4 -> 2, 10, 9, 3, 1, 7, 4, 5, 6, 8
/ \ /
5 6 8
调整节点2:
10
/ \
5 9
/ \ / \
3 1 7 4 -> 10, 5, 9, 3, 1, 7, 4, 2, 6, 8
/ \ /
2 6 8
最终得到的大根堆是{10, 5, 9, 3, 1, 7, 4, 2, 6, 8}。这个堆满足以下性质:
1. 对于任意节点i,其父节点的值大于等于i的值。
2. 对于任意节点i,其左子节点的值小于等于i的值,右子节点的值小于等于i的值。
堆排序算法的核心思想就是不断取出堆顶元素,并将剩余的元素重新构造成一个大根堆,直到所有元素都被取出。在本例中,我们需要按照升序排列,因此每次取出堆顶元素时都需要将其放到数组的末尾。最终得到的有序序列是{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}。
用自底向上算法为列表2,9,7,6,5,8构造一个大根堆。构造好的大根堆序列为
构造大根堆的过程如下:
1. 从最后一个非叶子节点开始,依次向上调整堆,保证每个节点都大于等于其左右子节点。
- 8 是最后一个非叶子节点,比较 8、5 和 6,交换 8 和 5 的位置,得到序列 [2, 9, 7, 5, 6, 8]。
2. 继续向上调整堆,比较 2、9 和 7,交换 2 和 9 的位置,得到序列 [9, 2, 7, 5, 6, 8]。
3. 继续向上调整堆,比较 9、2 和 7,不需要交换,得到序列 [9, 2, 7, 5, 6, 8]。
4. 继续向上调整堆,比较 9 和 2,交换 9 和 2 的位置,得到序列 [2, 9, 7, 5, 6, 8]。
最终构造好的大根堆序列为 [2, 9, 7, 5, 6, 8]。
阅读全文