以关键码序列(503,087,512,061,908,170,897,275,653,426)为例,手工执行以下排序算法,写出每一趟排序结束时的关键码状态: (1)堆排序;
时间: 2023-06-14 13:07:56 浏览: 251
手工实现-数据结构资料
堆排序的过程如下:
1. 建立一个初始堆,将原序列看作一个完全二叉树,从最后一个非叶子节点开始,从右到左,从下到上,对每个非叶子节点进行一次向下调整操作。
初始序列:503,087,512,061,908,170,897,275,653,426
建立的初始堆:
```
908
/ \
653 897
/ \ / \
275 426 512 170
/\
061 087
/
503
```
2. 取出堆顶元素(即最大值),将其和堆底元素交换位置,缩小堆的范围,再对堆顶进行向下调整操作。
第1趟排序:
取出堆顶元素 908,和堆底元素 426 进行交换,得到序列:
426,087,512,061,908,170,897,275,653,503
此时,堆的范围为 1~9,对堆顶元素 426 进行向下调整操作,得到堆:
```
897
/ \
653 512
/ \ / \
275 087 061 170
/
503
```
第2趟排序:
取出堆顶元素 897,和堆底元素 503 进行交换,得到序列:
503,087,512,061,426,170,897,275,653,908
此时,堆的范围为 1~8,对堆顶元素 503 进行向下调整操作,得到堆:
```
653
/ \
512 170
/ \ / \
275 087 061 426
/
897
```
第3趟排序:
取出堆顶元素 653,和堆底元素 897 进行交换,得到序列:
503,087,512,061,426,170,653,275,897,908
此时,堆的范围为 1~7,对堆顶元素 503 进行向下调整操作,得到堆:
```
512
/ \
426 170
/ \ / \
275 087 061 653
/
897
```
第4趟排序:
取出堆顶元素 512,和堆底元素 897 进行交换,得到序列:
503,087,512,061,426,170,275,653,897,908
此时,堆的范围为 1~6,对堆顶元素 503 进行向下调整操作,得到堆:
```
426
/ \
275 170
/ \ / \
087 061 512 653
/
897
```
第5趟排序:
取出堆顶元素 426,和堆底元素 897 进行交换,得到序列:
503,087,426,061,275,170,512,653,897,908
此时,堆的范围为 1~5,对堆顶元素 503 进行向下调整操作,得到堆:
```
275
/ \
170 061
/ \ / \
087 512 426 653
/
897
```
第6趟排序:
取出堆顶元素 275,和堆底元素 897 进行交换,得到序列:
503,087,275,061,170,426,512,653,897,908
此时,堆的范围为 1~4,对堆顶元素 503 进行向下调整操作,得到堆:
```
170
/ \
061 512
/ \ / \
087 426 275 653
/
897
```
第7趟排序:
取出堆顶元素 170,和堆底元素 897 进行交换,得到序列:
503,087,170,061,275,426,512,653,897,908
此时,堆的范围为 1~3,对堆顶元素 503 进行向下调整操作,得到堆:
```
275
/ \
061 426
/ \ / \
087 512 170 653
/
897
```
第8趟排序:
取出堆顶元素 275,和堆底元素 897 进行交换,得到序列:
503,087,170,061,275,426,512,653,908,897
此时,堆的范围为 1~2,对堆顶元素 503 进行向下调整操作,得到堆:
```
170
/ \
061 426
/ \ / \
087 512 275 653
/
908
```
第9趟排序:
取出堆顶元素 170,和堆底元素 908 进行交换,得到序列:
503,087,061,170,275,426,512,653,897,908
此时,堆的范围为 1~1,排序完成。
最终有序序列为:503,087,061,170,275,426,512,653,897,908
阅读全文