【数据结构与算法】内部排序课后习题

本文以一个关键码序列为例,详细展示了直接插入排序、希尔排序(增量d[1]=5)、快速排序和堆排序的过程,包括每趟排序结束时的关键码状态。希尔排序经过四次不同增量的排序,而快速排序通过递归完成。最后,还讨论了如何判断和调整最小堆。
摘要由CSDN通过智能技术生成

题目

下面一共有两道有关内部排序的课后习题,全部都是思路画图题并不是算法设计题故在此就一起列举出来了~


1. 以关键码序列(503,087,512,061,908,170,897,275,653,426)为例,手工执行以下排序算法,写出每一趟排序结束时的关键码状态:

  1. 直接插入排序
  2. 希尔排序(增量d[1]=5)
  3. 快速排序
  4. 堆排序

解答

1. 直接插入排序

说明:
[]里面的元素是已选择的关键码,{}里面的元素是待选择的关键码,每次会从{}里面的选第一个元素直接插入到[]里面

STEP1:
[503], {087, 512, 061, 908, 170, 897, 275, 653, 426}
STEP2:
[087, 503], {512, 061, 908, 170, 897, 275, 653, 426}
STEP3:
[087, 503, 512], {061, 908, 170, 897, 275, 653, 426}
STEP4:
[061, 087, 503, 512], {908, 170, 897, 275, 653, 426}
STEP5:
[061, 087, 503, 512, 908], {170, 897, 275, 653, 426}
STEP6:
[061, 087, 170, 503, 512, 908], {897, 275, 653, 426}
STEP7:
[061, 087, 170, 503, 512, 897, 908], {275, 653, 426}
STEP8:
[061, 087, 170, 275, 503, 512, 897, 908], {653, 426}
STEP9:
[061, 087, 170, 275, 503, 512, 653, 897, 908], {426}
STEP10:
[061, 087, 170, 275, 426, 503, 512, 653, 897, 908]


2. 希尔排序

说明:
一共进行了四次希尔排序各次的DK值分别为5、3、2、1
从排序前的第一个元素开始依次往后,跟其后面第DK个元素进行比较,小的在前面大的在后,直至后面第DK个元素不存在结束

STEP1(DK = 5):
排序前:503 087 512 061 908 170 897 275 653 426
排序后:170 087 275 061 426 503 897 512 653 908
STEP2(DK = 3)
排序前:170 087 275 061 426 503 897 512 653 908
排序后:061 087 275 170 426 503 897 512 653 908
STEP3(DK = 2)
排序前:061 087 275 170 426 503 897 512 653 908
排序后:061 087 275 170 426 503 653 512 897 908
STEP4(DK = 1)
排序前:061 087 275 170 426 503 653 512 897 908
排序后:061 087 170 275 426 503 653 512 897 908


3. 快速排序

取第一个关键码503为关键字

第一步
在这里插入图片描述
第二步
在这里插入图片描述
第三步
在这里插入图片描述
第四步
在这里插入图片描述
第五步
在这里插入图片描述
第六步
在这里插入图片描述

第七步
在这里插入图片描述
第八步
在这里插入图片描述
第九步
在这里插入图片描述
至此完成了第一次快速排序,将503作为关键词进行的快速排序,小于503均在左边,大于503的均在右边。但是左右两边是无序的由此可知要递归处理左右子序列

  • 对其左子序进行排序426 087 275 061 170 (参照上述步骤可得)
    061 087 170 275 426
  • 同理可得右子序 897 908 653 512进行递归排序后得
    512 653 897 908

由此整个排序已完成
061 087 170 275 426 512 061 087 170 275 426


4. 堆排序

初始大顶堆
在这里插入图片描述
开始进行堆排序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


2.判断以下序列是否是最小堆?如果不是,将它调整为最小堆。

  1. {100,86,48,73,35,39,42,57,66,21}
  2. {12,70,33,65,24,56,48,92,86,33}

解答

该解答分为两个大部分,分别为序列一的解答和序列二的解答。

序列一

原序列堆图像
在这里插入图片描述
调整为最小堆后
在这里插入图片描述

序列二

原序列堆图像
在这里插入图片描述
调整为最小堆后
在这里插入图片描述


结束语

  因为是算法小菜,所以提供的方法和思路可能不是很好,请多多包涵~如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hiddenSharp429

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值