2022年结构各种排序算法课程分析方案.docx
《2022年结构各种排序算法课程分析方案.docx》由会员分享,可在线阅读,更多相关《2022年结构各种排序算法课程分析方案.docx(60页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选学习资料 - - - - - - - - - 课程设计题目 排序算法实现将比较滁 州 学 院课程设计报告课程名称:数据结构设计题目 :排序算法实现及比较系别:运算机信息工程学院专业:运算机科学与技术组别:第*组起止日期 : 12 年 5 月 1 日 12 年 6 月 1 日指导老师 :* 运算机与信息工程学院二一二年制课程设计任务书1 / 32 名师归纳总结 - - - - - - -第 1 页,共 32 页精选学习资料 - - - - - - - - - 组长* 学号20* 班级* 系别运算机与信息工程学院专业* 运算机科学与技术组员* 指导老师加深对常见排序算法懂得 课程设计目的 通过
2、程序比较常见算法优越性 熟识加深对数据结构的明白及熟识课程设计所需环境 Windows xp;VC+6.0 实现常见排序算法程序化课程设计任务要求测试程序比较算法优越性 明白常见算法的实际应用课程设计工作进度方案序号起止日期工 作 内 容年分工情形1 分析试验类容编写报告2 分工3 算法改编成程序将子程序合并及调试4 数据测试及记录5 指导老师签字:月日系教研室)审核看法:系教研室)主任签字:年月日目录1.引言 3 2.需求分析 4 3.具体设计 4 3.1 直接插入排序 4 3.2 折半排序 4 3.3 希尔排序 5 3.4 简洁挑选排序 6 2 / 32 名师归纳总结 - - - - -
3、- -第 2 页,共 32 页精选学习资料 - - - - - - - - - 3.5 堆排序 6 3.6 归并排序 7 3.7 冒泡排序 9 4.调试 10 5.调试及检验 10 5.1 直接插入排序 10 5.2 折半插入排序 11 5.3 希尔排序 11 5.4 简洁挑选排序 12 5.5 堆排序 12 5.6 归并排序 13 5.7 冒泡排序 14 6.测试与比较 15 6.1 调试步骤 15 6.2 结论 15 7.试验心得与分析 15 8.附录 16 8.1 直接插入排序 16 8.2 折半插入排序 17 8.3 希尔排序 19 8.4 简洁挑选排序 21 8.5 堆排序 23 8
4、.6 归并排序 25 8.7 冒泡排序 28 8.8 主程序 30 1.引言相伴着社会的进展,数据也变得越来越巨大;如何将巨大的数据进行很好的排序,使用户更加方 便的查找资料,成了一件越来越重要的问题;对于程序员来说,这将是一个挑战;常常查找资料的伴侣都会知道,面对海量的资料,假如其查找的资料没有进行排序,那么其查找 资料将会是一件特别痛楚的事情;针对这一问题,我们自此通过一个课程设计来解决它;理论上排序算法有许多种,不过本课程设计只涉及到七种算法;这七种算法共包括:直接插入排 序,折半插入排序,希尔排序,简洁挑选排序,堆排序,归并排序,冒泡排序;本课程设计通过对这七种算法的运行情形进行对比,
5、挑选最优秀的算法来供应应用户;期望通过 我们的努力能给用户解决一些问题,带来一些便利;3 / 32 名师归纳总结 - - - - - - -第 3 页,共 32 页精选学习资料 - - - - - - - - - 2.需求分析本课程题目是排序算法的实现,由于各方面的缘由,本课程设计一共要设计七种排序算法;这七种算法共包括:直接插入排序,折半插入排序,希尔排序,简洁挑选排序,堆排序,归并排序,冒泡排序;七种排序各有独到之处,因此我们要通过各种调试分析来比较其优劣长短;为了小组分工的便利,我们特意把子函数写成Header File 文件;这样操作不仅可以使小组分工更加简洁明白,仍可以便利子函数的调
6、用,更可以使写主函数时一目了然;为了运行时的便利,我们将七种排序方法进行编号,其中1 为直接插入排序,2 为折半插入排序,3 为希尔排序, 4 为简洁挑选排序,5 为堆排序, 6 为归并排序, 7 为冒泡排序;通过这七种选项,可以让用户简洁明白的去挑选使用哪一种排序方法;本课程就是通过对 5 组占用内存大小不同的数据调试来测试这七种算法运行的时间长短,从中选 择面对不同大小的文件时,哪一种算法更为快捷;软件环境本课程设计所用操作系统为Windows-XP操作系统,所使用的软件为Microsoft Visual C+ 6.0 ;3.具体设计3.1 直接插入排序 算法思想:直接插入排序是一种最简洁
7、的排序方法,它的基本操作是将一个记录插入到一个已排好序的有序表中,从而得到一个新的、记录数增一的有序表;在自i-1 起往前搜寻的过程中,可以同时后移记录;整个排序过程为进行 n-1 趟插入,即:先将序列中的第一个记录看成是一个有序的 子序列,然后从其次个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止;程序实现及核心代码的注释:for i = 1 ; i forj=0 ;j ifr.basei temp = r.basei; / 储存待插入记录 fori= i ;i j ; -i r.basei = r.basei-1 ; /记录后移 r.basej = temp; / 插入到正
8、确的为位置 r.baser.length =0 ;3.2折半排序 算法思想:由于折半插入排序的基本操作是在一个有序表中进行查找和插入,这个“查找 ”操作可 利用折半查找来实现,由此进行的插入排序称之为折半插入排序;折半插入排序所需附加储备空间4 / 32 名师归纳总结 - - - - - - -第 4 页,共 32 页精选学习资料 - - - - - - - - - 和直接插入排序相同,从时间上比较,这般插入排序仅削减了关键字间的比较次数,而记录的移动 次数 不变;因此,这般插入排序的时间复杂度仍为 O / 对次序表作折半插入排序 for i = 1 ; i temp=r.basei ; /将
9、 r.basei寄存在 temp 中 low=0 ;high=i-1 ;while low /在 baselow 到 keyhigh 中折半查找有序插入的位置 m = low+high/2 ; /折半 if temp high = m-1 ; /插入低半区 else low = m+1 ; /插入高半区 for j=i-1 ; j=high+1 ; -j r.basej+1= r.basej ; /记录后移 r.basehigh+1=temp ; /插入 3.3 希尔排序 算法思想:先将整个待排记录序列分割成为如干子序列分别进行直接插入排序,待整个序列中的 记录 “基本有序 ”时,再对全体记录
10、进行一次直接插入排序;其中,子序列的构成不是简洁的“ 逐段分割 ” ,而是将分隔某个“ 增量 ” 的记录组成一个子序列;程序实现及核心代码的注释:fork = 0 ; k m = 10 - k ;for i = m ; i ifr.basei 5 / 32 名师归纳总结 - - - - - - -第 5 页,共 32 页精选学习资料 - - - - - - - - - temp = r.basei; / 储存待插记录 forj = i - m ; j = 0 & temp r.base j + m = r.basej ; /记录后移,查找插入位置 r.base j + m = temp ; /
11、 插入 3.4简洁挑选排序 算法思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当 中再找最小的与其次个位置的数交换,如此循环到倒数其次个数和最终一个数比较为止;程序实现及核心代码的注释:for i = 0 ; i /i 为排好序的数的下标,依次往后存放排 /好序的数 temp=r.basei; / 将待放入排好序的数的下标的数储存 for j = i,m = j +1 ; m / 找出未排序的数中最小的数的循环;ifr.basej r.basem j = m ;r.basei = r.basej ; / 把下标为 j 的数与 i 数互换;r.basej = te
12、mp; 3.5堆排序 算法思想:堆排序只需要一个记录大小的帮助空间,每个待排序的记录仅占有一个储备空间;将 序列所储备的元素 AN 看做是一棵完全二叉树的储备结构,就堆实质上是满意如下性质的完全二叉树:树中任一非叶结点的元素均不大于 间复杂度为 ONlogN ;程序实现及核心代码的注释:void dpFILE *fp 或不小于 其左右孩子 如存在 结点的元素;算法的平均时fori = r.length / 2 ;i = 1 ; -i / 把 r.base1.r.length 建成大顶堆 HeapAdjustr.base,i,r.length ; fori = r.length ;i = 2 ;
13、 -i temp = r.base1; r.base1 = r.basei;r.basei = temp;6 / 32 名师归纳总结 - - - - - - -第 6 页,共 32 页精选学习资料 - - - - - - - - - HeapAdjustr.base,1,i-1 ; /将 r.base1.i-1 重新调整为大顶堆 void HeapAdjustchar *r,int k,int m i=k ; x=ri ; j=2*i ; / 沿 key 较大的孩子节点向下挑选 whilej /j 为 key 较大的记录的下标 if j & rjrj+1 j+ ;ifxrj / 插入字符比当前
14、的大,交换 ri =rj ;i = j ;j *= 2 ; else /否就比较停止;j = m + 1 ; ri = x ; / 把字符 x 插入到该位置,元素插入实现 3.6归并排序算法思想:先将相邻的个数为1 的每两组数据进行排序合并;然后对上次归并所得到的大小为2的组进行相邻归并;如此反复,直到最终并成一组,即排好序的一组数据;程序实现及核心代码的注释:void mergeSqList6 r,int h ,int m ,int w ,SqList6 t / 对相邻两组数据进行组合排序;int i,j,k ;i = h ;j = m + 1 ; /j 为合并的其次组元素的第一个数位置 k
15、 =h-1; / k 为存入 t 中的数的位置;whilei &j / 依次排列两组数据 k+; ifr.basei / 将第一组数据与其次组数据分别比较;7 / 32 名师归纳总结 - - - - - - -第 7 页,共 32 页精选学习资料 - - - - - - - - - t.basek = r.basei+ ;else t.basek = r.basej+ ; ifi m / 第一组数据先排完的情形 whilej t.base+k=r.basej+;else whilei t.base+k=r.basei+; void tgbint s,int n,SqList6 r,SqList
16、6 t / 对数据进行每组 s 个数的归并排序;int i=1 ; /i 为要合并两组元素的第一个数位置;whilei merger,i,i+s-1,i+2*s-1,t ; /i+s-1 为要合并的第一组元素的最终一 /数位置、 i+2*s-1 为要合并的两 组元素/最终一个数位置;i=i+2*s ; ifi / 考虑 n 不能被 s 整除,假如余下的数少于 /2*s 但大于 s,也就是余下的数 不能凑成/两组,凑一组有余 ,就把余下的 数进行组/合,并对其进行排序;merger,i,i+s-1,n,t ;else /假如余下的数少于s,就余下的数进行组/合,并进行排序;whilei t.ba
17、sei=r.basei+ ; void gbFILE *fp / 归并主函数; n = r.length;8 / 32 名师归纳总结 - - - - - - -第 8 页,共 32 页精选学习资料 - - - - - - - - - SqList6 t ;t.base=char * mallocr.stacksize*sizeofchar ; /给待排序的数组 t 申请内存; whiles / 每组元素不断增加循环进行合并排序; tgbs,n,r,t; / s 为每组元素的个数、n 为元素总个数、r / 为原数组, t 为待排序的数组,进行归并排 s*=2 ; / 序;把元素个数相同的两组合并
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022 结构 各种 排序 算法 课程 分析 方案
限制150内