已知待排序序列9 1 2 5 7 4 8 6 3 5假如要对该序列进行什序,请你给出增量为5的希尔排序第一趟的结果并画出初始创建的大根堆形态
时间: 2024-01-04 18:02:49 浏览: 32
首先,增量为5的希尔排序第一趟需要对序列进行分组,每组相邻元素之间隔着4个元素。即分为5组:
9 1 2 5 7
4 8 6 3 5
对每组进行插入排序,得到:
7 1 2 5 9
4 5 6 3 8
最后,将每组排好序的子序列合并为一个有序序列:
7 1 2 5 9 4 5 6 3 8
同时,初始创建的大根堆形态为:
9
/ \
7 8
/ \ / \
5 4 6 3
/
1
/ \
2 5
其中,大根堆的定义为:每个节点的值都大于或等于其左右子节点的值。
相关问题
对关键字序列4,2,8,5,7,6,1,3,10,9,做两路归并排序
两路归并排序的步骤如下:
1. 分割序列:将待排序的序列按照中间位置分为两个序列,分别记为 left 和 right。
2. 递归排序:将左右两个序列分别进行递归排序,直到每个序列只剩下一个元素。
3. 合并序列:将排好序的左右两个序列按照顺序合并,得到排好序的完整序列。
根据上述步骤,对关键字序列4,2,8,5,7,6,1,3,10,9进行两路归并排序的过程如下:
1. 将序列按照中间位置划分为两个序列:left序列为4,2,8,5,7;right序列为6,1,3,10,9。
2. 对左右两个序列进行递归排序:
left序列的排序过程:
- 将 left 序列按照中间位置划分为两个序列:l1序列为4,2;l2序列为8,5,7。
- 对 l1 序列递归排序,得到排好序的 l1 序列为2,4。
- 对 l2 序列递归排序,得到排好序的 l2 序列为5,7,8。
- 将排好序的 l1 和 l2 序列按照顺序合并,得到排好序的 left 序列为2,4,5,7,8。
right 序列的排序过程:
- 将 right 序列按照中间位置划分为两个序列:r1序列为6,1,3;r2序列为10,9。
- 对 r1 序列递归排序,得到排好序的 r1 序列为1,3,6。
- 对 r2 序列递归排序,得到排好序的 r2 序列为9,10。
- 将排好序的 r1 和 r2 序列按照顺序合并,得到排好序的 right 序列为1,3,6,9,10。
3. 将排好序的左右两个序列按照顺序合并:
- 已知 left 序列为2,4,5,7,8;right 序列为1,3,6,9,10。
- 定义一个新序列 result,用于存放合并后的结果。
- 分别定义两个指针,p1 和 p2,初始指向 left 和 right 序列的第一个元素。
- 比较 p1 和 p2 指向的元素大小,将较小的值插入 result 序列中。
- 如果 p1 或 p2 已经到达序列末尾,则将另一个序列中的剩余元素依次插入 result 序列中。
- 重复步骤4和5,直到 left 和 right 序列中的所有元素都插入到 result 序列中为止。
- 最终得到排好序的完整序列为1,2,3,4,5,6,7,8,9,10。
已知一组待排序的关键字{1,4,2,7,5,3,8,9},请写出计数排序的详细过程。
好的,计数排序是一种非比较排序算法,它的时间复杂度为O(n+k),其中n是待排序元素的个数,k是待排序元素的取值范围。下面是这组待排序关键字的计数排序过程:
1. 首先,找出待排序关键字中的最大值和最小值,即最大值为9,最小值为1。
2. 计算待排序关键字中每个元素出现的次数,创建一个长度为9-1+1=9的数组count,count[i]表示数字i在待排序关键字中出现的次数,初始值都为0。
3. 遍历待排序关键字,将关键字出现的次数记录在count数组中,例如关键字1出现了1次,那么count[1]的值就加1。
4. 接着,对count数组进行前缀和计算,即从count[1]开始,每个元素加上前一个元素的值,例如count[2]的值就加上count[1]的值。
5. 创建一个长度为8的数组result,表示排序后的结果。
6. 从待排序关键字的末尾开始遍历,将每个元素放入result数组中的正确位置。具体地,假设当前关键字为x,那么它在result数组中的下标为count[x]-1,同时count[x]的值也要减1。
7. 最后,result数组中存放的就是排好序的关键字序列。
经过以上步骤,我们就得到了这组待排序关键字的计数排序结果。