前言
为了帮助同学们完成痛苦的实验课程设计,本作者将其作出的实验结果及代码贴至CSDN中,供同学们学习参考。如有不足或描述不完善之处,敬请各位指出,欢迎各位的斧正!
一、实验内容
第270页第二题第一小题
设待排序的关键字序列为{12,2,16,30,28,10,16*,20,6,18},试分别写出使用以下排序方法,每趟排序结束后关键字序列的状态。
①直接插入排序
②折半插入排序
③希尔排序(增量选取5、3和1)
④冒泡排序
⑤快速排序
⑥简单选择排序
⑦堆排序
⑧二路归并排序
第270页第二题第二小题
给出如下关键字序列(321,156,57,46,28,7,331,33,34,63},试按链式基数排序方法,列出每一趟分配和收集的过程。
二、实验环境
Dev C++或Visual Studio 2019
三、实验目的
通过做排序图,掌握每一步排序进行的方式
四、算法设计
①直接插入排序
初始:
第一步(2与12比较):
第二步(16与2、12比较):
第三步(30与2、12、16比较):
第四步(28与2、12、16、30比较):
第五步(10与2、12比较):
第六步(16与2、10、12、16、28比较):
第七步(20与2、10、12、16、16、28比较):
第八步(6与2、10比较):
第九步(18与2、6、10、12、16、16*、20比较):
②折半插入排序
初始:
第一步(2和12比较):
第二步(16和2、12比较):
第三步(30和12、16比较):
第四步(28和12、16、30比较):
第五步(10和16、12、2比较):
第六步(16和12、28、16比较):
第七步(20和16、28、16比较):
第八步(6和16、10、2比较):
第九步:(18和16、20、16*比较)
③希尔排序(增量选取5、3和1)
初始:
第一步(增量为5):
第二步(增量为3):
第三步(增量为1):
④冒泡排序
初始:
第一步:
第二步:
第三步:
第四步:
第五步:
第六步:
第七步:
第八步:
第九步:
⑤快速排序
初始:(将第一位12作为基准元素)
第一步(right指针进行左移并与基准元素进行比较):
第二步(left指针进行右移并于基准元素进行比较):
第三步:
第四步(直到指针left=指针right时停止):
第五步(同样的方式在基准元素左右继续排序):
第六步:
第七步:
第八步:
第九步:
第十步:
即
⑥简单选择排序
初始:
第一步:
第二步:
第三步:
第四步:
第五步:
第六步:
第七步:
第八步:
第九步:
第十步:
第十一步:
第十二步:
第十三步:
第十四步:
第十五步:
第十六步:
第十七步:
第十八步:
第十九步:
⑦堆排序
初始:
即:
第一步(从最后一个非叶子结点开始,从左至右,从下至上):
第二步:
第三步(根节点与最后一个叶子交换):
第四步:
第五步:
第六步:
第七步:
第八步:
第九步:
第十步:
第十一步:
即:
⑧二路归并排序
初始:
第一步:
第二步:
第三步:
第四步:
第五步:
第六步:
第二题 链式基数排序:
初始:
第一步(首先按照各个数据的个位数字分配到0-9的10个区间内):
即:
第二步(按照十位数字进行分配):
即:
第三步:(按照百位数字进行分配):
即:
五、实验分析(选做)
①直接插入排序
时间复杂度:O(n^2)
空间复杂度:O(1)
②折半插入排序
时间复杂度:O(n^2)
空间复杂度:O(1)
③希尔排序(增量选取5、3和1)
时间复杂度:O(n^1.3)
空间复杂度:O(1)
④冒泡排序
时间复杂度:O(n^2)
空间复杂度:O(1)
⑤快速排序
时间复杂度:O(nlog2n)
空间复杂度:O(1)
⑥简单选择排序
时间复杂度:O(n^2)
空间复杂度:O(1)
⑦堆排序
时间复杂度:O(nlog2n)
空间复杂度:O(1)
⑧二路归并排序
时间复杂度:O(nlog2n)
空间复杂度:O(n)
⑨链式基数排序
时间复杂度:O(d(r+n))
空间复杂度:O(rd+n)