对于待排序记录序列{10,25, 15,18, 35, 20, 30,12,21),写出建堆过程(写出结果序列并画出大根堆
时间: 2024-11-26 09:00:50 浏览: 0
对于给定的无序整数序列 {10, 25, 15, 18, 35, 20, 30, 12, 21},我们可以按照大顶堆(最大堆)的构造规则来构建。大顶堆是一种特殊的完全二叉树,其中每个节点的值都大于或等于其子节点的值。
以下是建堆的过程:
1. 将序列的第一个元素作为初始根节点(由于序列已排序,这里假设我们从最后一个非叶子节点开始,即倒数第二个元素)。
- 初始堆:35
2. 交换堆顶(当前最大值)与最后一个元素,并将最后一个元素下沉到满足大顶堆性质的位置。
- 新堆:21 (原35) -> 12 (原10) -> 25 -> 15 -> 18 -> 30 -> 20
3. 再次检查新的堆顶,如果它违反了大顶堆条件(即大于任意一个子节点),则将其与较大的子节点交换,然后继续下沉。
- 新堆:20 (原21) -> 12 -> 25 -> 15 -> 18 -> 30 -> 35 (原20)
4. 重复这个过程直到整个序列变成一个大顶堆。
最终的大根堆结构如下:
```
35
/ \
30 20
/ \ / \
25 18 15 12
```
下面是每一步操作后的序列:
- 第一步:{12, 25, 15, 18, 35, 20, 30, 10}
- 第二步:{12, 25, 15, 18, 20, 35, 30, 10}
- 第三步:{12, 20, 15, 18, 25, 35, 30, 10}
请注意,序列已经变为大顶堆形式,根节点35总是序列中的最大值。
相关问题
对于待排序记录序列{10,25, 15,18, 35, 20, 30,12,21),写出建堆过程(写出结果序列并画出大根堆)
首先,我们需要将给定的序列构建成一个大顶堆(一种满足完全二叉树性质且每个节点值大于其左右孩子的节点值的特殊二叉堆)。下面是建堆的过程:
原始序列: {10, 25, 15, 18, 35, 20, 30, 12, 21}
1. 从最后一个非叶子节点开始(最后一个元素的位置为序列长度减一),因为最后一个叶子节点及其以上的节点已经形成了大顶堆的性质。这里我们从倒数第二个元素(即索引为8的元素12)开始。
- 索引8: 12 (调整为最大值)
- 比较12与其父节点(索引4,30),交换位置,得到{10, 25, 15, 18, 30, 20, 12, 35, 21}
2. 对新交换后的节点30继续进行比较和调整:
- 索引4: 30 (比当前最大值12大,不需要调整)
3. 继续向上调整节点12:
- 索引3: 20 (12比20小,无需调整)
- 索引2: 15 (12比15小,无需调整)
- 索引1: 10 (12比10大,交换位置,得到{12, 25, 15, 18, 30, 20, 10, 35, 21})
此时,前四个元素已经是大顶堆了。由于我们是从倒数第二层开始调整的,所以剩下的元素也是依次往上层移动,确保满足堆的性质。
最终的大根堆序列为: {35, 30, 25, 21, 20, 18, 15, 12, 10}
下面是一个简化的堆结构图示意:
```
35
/ \
30 25
/ \ / \
21 20 18 15
/ \ /
12 10 12
```
现有待排序序列{25,84,21,47,15,27,68,35,20},请写出利用希尔排序进行排序的过程。
希尔排序是一种改进的插入排序,相比于插入排序具有更高的效率。它的基本思想是将待排记录按下标的一定增量分组,对每组使用直接插入排序算法进行排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列恰被分成一组,算法便终止。
以{25,84,21,47,15,27,68,35,20}为例,假设我们采用增量序列为{4,2,1},则初始时,整个序列被分成了4组,每组分别为{25,15,68},{84,27,35},{21,68,20},{47}。然后对每组进行插入排序,得到:
{15,25,68},{27,35,84},{20,21,68},{47}
此时,增量变为2,将序列分成了两组,每组分别为{15,27,20,47}和{25,35,84,21,68}。再对每组进行插入排序,得到:
{15,20,27,47},{21,25,35,68,84}
最后,增量变为1,整个序列只有一组,对其进行插入排序即可,最终得到的有序序列为{15,20,21,25,27,35,47,68,84}。
阅读全文