题目
下面一共有两道有关内部排序的课后习题,全部都是思路画图题并不是算法设计题故在此就一起列举出来了~
1. 以关键码序列(503,087,512,061,908,170,897,275,653,426)为例,手工执行以下排序算法,写出每一趟排序结束时的关键码状态:
- 直接插入排序
- 希尔排序(增量d[1]=5)
- 快速排序
- 堆排序
解答
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.判断以下序列是否是最小堆?如果不是,将它调整为最小堆。
- {100,86,48,73,35,39,42,57,66,21}
- {12,70,33,65,24,56,48,92,86,33}
解答
该解答分为两个大部分,分别为序列一的解答和序列二的解答。
序列一
原序列堆图像
调整为最小堆后
序列二
原序列堆图像
调整为最小堆后
结束语
因为是算法小菜,所以提供的方法和思路可能不是很好,请多多包涵~如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!