数据结构课程设计报告.docx
- 文档编号:8525419
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:18
- 大小:109.97KB
数据结构课程设计报告.docx
《数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告
数据结构课程设计
题目柒排序
学生姓名专业班级软件
指导教师职称 讲师
所在单位工学部
教学部主任
完成日期2010年01月08日
《数据结构课程设计》报告
DataStructureExperimentDesigning
课程编号:
030160学时:
40学时
适用专业:
软件工程专业授课单位:
信息学院
一、数据结构课程设计目的及要求
目的:
数据结构课程设计是在学完数据结构课程之后的实践教学环节。
该实践教学是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧。
学生在设计中逐步提高程序设计能力,培养科学的软件工作方法。
要求:
1.分析问题,给出数学模型,设计相应的数据结构.
2.算法设计。
1.用测试数据去验证算法及程序的正确性。
2.算法分析。
3.提高上机编程能力
二、实验类型
综合类型
三、实验学时
40学时
四、实验设备
微型计算机、WINDOWS98以上版本的操作系统、TurboC2.0软件一套
五、C语言课程参考教材:
1.严蔚敏吴伟民著,《数据结构(C语言版)》,清华大学出版1999年第一版
2.陈一华等编,《数据结构---使用C语言》,电子科技大学出版社1998年第一版
课程设计(报告)任务书
任务及要求:
1.设计(研究)内容和要求
研究内容:
排序的算法分析与设计
任务和要求:
(1).学习数据结构基础知识,掌握数据结构典型的算法的使用。
(2).对指导教师下达的题目进行系统分析。
(3).根据分析结果完成系统设计。
(4).编程:
在计算机上实现题目的代码实现。
(5).完成对该系统的测试和调试。
(6).提交课程设计报告。
(7).指标:
要求完成课程设计报告3000字以上(约二十页)。
完成若干综合性程序设计题目,综合设计题目的语句行数的和在100行语句以上。
2.原始依据
结合数据结构课程中的基本理论和基本算法,正确分析出数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。
提高程序设计和调试能力。
学生通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3.参考文献
[1]严蔚敏吴伟民著.《据结构(C语言版),清华大学出版,1999年第一版
[2]陈一华等编.数据结构---使用C语言,电子科技大学出版社,1998年第一版
[3]谭浩强.C语言程序设计(第二版).北京:
高等教育出版社,2002
指导教师签字:
2009年 12月21日
目录
题目一:
1
1.需求分析1
2.概要设计1
3.详细设计1
4.调试分析1
5.测试结果及运行效果1
参考文献2
附录全部代码3
题目一:
排序的算法分析与设计
1.需求分析
以无歧义的陈述说明程序设计的任务,强调的是程序要做什么并明确规定:
(1)输入的形式和输入值的范围;
输入的形式:
(随机输入)逻辑结构:
数组
物理结构:
顺序存储
输入值的范围:
-32768~32767
(2)输出的形式:
输出连续的有序数组
(3)程序所能达到的功能:
排序,又称分类,是计算机程序设计中一种重要运算,。
根据排序过程中所涉及的存储器可分为内部排序和外部排序。
它的功能是将一组任意序列的数据元素进行按由小到大的顺序(升序)排列。
这些数据可以是数值型,也可以是为字符型,若为数值型,则按数值大小排列,若为字符型,则按其ASCII码的顺序排列。
(4)测试数据:
包括正确的输入及其输出结果和含有错误的输入及其输出结果.
正确的输入:
49386597761327495504
输出结果:
04132738494955657697
含有错误的输入:
-32779493865977613274955
输出结果:
13273849495565769732757
2.概要设计
说明本程序中用到的所有抽象数据类型的定义,主程序的流程以及各程序模块之间的层次(调用)关系.
数据类型:
一维数组
进入主菜单—>选择排序类型(包括插入类型、交换类型、选择类型和归并类型)—>
选择具体排序方法—>输出结果。
3.详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:
按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);可采用流程图N-S图进行描述,画出函数和过程的调用关系图。
4.调试分析
内容包括:
a.调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;
解决方法:
查阅资料、书籍和老师的指导,反复阅读示例文档。
实现:
反复修改、调试。
b.算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想;
⏹直接插入排序
1.时间复杂度:
最好情况:
正序O(n);最坏情况:
逆序O(n2)
2.空间复杂度:
O
(1)
3.稳定性:
稳定
4.基本思想:
直接插入排序是一种比较简单的排序方法。
它的基本思想是一次将记录序列中的每一个记录插入到有序段中,是有许多的长度不断地扩大。
首先将待排序记录序列中的第一个记录作为一个有序段,将记录序列中的第二个记录插入到上述有序段中形成由两个记录组成的有序段,再将记录序列中的第三个记录插入到这个有序段中,形成由三个记录组成的有序段,……以此类推,每一趟都是将一个记录插入到前面的有序段中,假设当前欲处理第i个记录,则应该将这个记录插入到由前i-1个记录组成的有序段中,从而形成一个由i个记录组成的按关键字值排列的有序序列,知道所有记录都插入到有序段中。
一共需要讲过n-1趟就可以将初始序列的n个记录重新排列成按关键字值大小排列的有序序列。
5.基本操作:
voidinsertSort(RecTypeR[])/*对数组R中的记录进行直接插入排序*/
{inti,j;
for(i=2;i<=N;i++)/*待插入记录为R[2],…,R[N]*/
{R[0]=R[i];/*将待插入的记录R[i]放入R[0]中*/
j=i-1;
while(R[0].key R[j+1]=R[j--];/*将排序码大于R[i].key的记录后移*/ R[j+1]=R[0];/*插入R[i]*/ } } ⏹希尔排序 1.时间复杂度: O(n1.5) 2.空间复杂度: O (1) 3.稳定性: 不稳定 4.基本思想: 希尔排序方法又称为缩小增量排序,其基本思想是将待排序的记录划分成几组,从而将少参与直接插入排序的数据量,当经过几次分组排序后,记录的排列已经基本有序,这个时候再对所有的记录实施直接插入排序。 假设待排序的记录为n个,先取整数d 5.基本操作: voidshellInsert(RecTypeR[],intd)/*按步长d进行分组,每一组分别 做直接插入排序*/ {inti,j; for(i=d+1;i<=N;i++) {R[0]=R[i];j=i-d;/*将R[i]暂存在R[0]*/ while(j>0&&R[j].key>R[0].key) {R[j+d]=R[j]; j=j-d;/*记录后移,查找插入位置*/ } R[j+d]=R[0];/*插入记录*/ } } 整个希尔排序算法的C函数: voidshellSort(RecTypeR[],intd[],intt)/*d[0]~d[t-1]为每一趟分组的步长*/ {intk; for(k=0;k shellInsert(R,d[k]); } ⏹起泡排序 1.时间复杂度: O(n2) 2.空间复杂度: O (1) 3.稳定性: 稳定 4.基本思想: L 起泡排序是交换排序中一种简单的排序方法。 它是对所有相邻记录的关键字值进行比较,如果是逆序,则将其交换,最终达到有序化。 器处理过程为: (1)将整个待排序的记录序列划分成有序区和无序区,初始状态为空,无序区包括所有待排序的记录。 (2)对无序区从前次向后依次将相邻记录的关键字进行比较,若逆序将其交换,从而使得关键字值小的记录向上“漂浮”(左移)关键字值大的记录好像石块,向下“堕落”(右移)。 每经过一趟起泡排序,都是无序区中关键字值最大的记录进入与序曲,对于由n个记录组成的记录序列,最多经过n-1趟起泡排序,就可以将这n个记录重新按关键字顺序排列。 5.基本操作: voidbubbleSort(RecTypeR[])/*采用起泡排序对R数组的记录进行排序*/ {RecTypex; inti,j,flag; for(i=1;i {flag=1;/*flag表示每趟排序是否交换,比较之前置为1,表示无交换*/ for(j=1;j<=N-i;j++)/*进行第i趟排序*/ if(R[j].key>R[j+1].key) {x=R[j];R[j]=R[j+1];R[j+1]=x; flag=0; } if(flag)break;/*若没有交换,表明已有序,结束循环*/ } } ⏹快速排序 1.时间复杂度: O(n*log2n) 2.空间复杂度: O(log2n) 3.稳定性: 不稳定 4.基本思想: 快速排序又称为分区间交换排序。 首先将待排序记录序列中的所有记录作为当前待排序区域,从中任选取一个记录,并以该记录的关键字值为基准,从位于待排序记录序列左右两端开始,组建向中间靠拢,交替与基准记录的关键字进行比较、交换,每次比较,若遇左侧记录的关键字值大于基准记录的关键字,则将其也基准记录及其交换,使其移至基准记录的左侧,最后让基准记录到达它的最终位置,此时,基准记录将待排序记录分成了左右两个区域,位于基准记录左侧的记录都小于或等于基准记录的关键字,位于基准记录右侧的所有记录的关键字都大于或等于基准记录的关键字,这就是一趟快序排序;然后分别对左右两个新的待排序区域,重复上述一趟快速排序的过程,其结果分别让左右两个区域中的基准记录都达到它们的最终位置,同时将待排序记录序列分成更小的待排序区域,再次重复对每个区域进行一趟快速排序,直到每个区域只有一个记录为止,此时所有的记录都到达了它的最终位置,即整个待排序记录按关键值有序排列,至此排序结束。 5.基本操作: 一次划分和快速排序递归算法的C函数如下: intpartition(RecTypeR[],intlow,inthigh)/*一趟快速排序*/ {intk; R[0]=R[low];/*以子表的第一个记录作为基准记录*/ k=R[low].key;/*取基准记录排序码*/ while(low {while((low high--; if(low R[low]=R[high]; while((low low++; if(low } R[low]=R[0];/*基准记录到位*/ returnlow;/*返回基准记录所在位置*/ } voidQSort(RecTypeR[],intlow,inthigh)/*对数组R的子区间[low…high]做快速排序*/ {intpart; if(low {part=partition(R,low,high);/*将表一分为二*/ QSort(R,low,part-1);/*对前面的子区间快速排序*/ QSort(R,part+1,high);/*对后面的子区间快速排序*/ } } ⏹选择排序 5.时间复杂度: O(n2) 2.空间复杂度: O (1) 3.稳定性: 不稳定 4.基本思想: 每一趟在n-i+1(i=1,2,3,…,n-1)个记录中选取关键字最小的记录作为有序序列中的第i个记录。 具体实现如下: (1)将整个记录序列划分为有序区域和无序区域,有序区域位于最左端,无序区域位于右端,初始状态有序区域为空,无序区域含有待排序的所有n个记录。 (2)设置一个整型变量index,用于记录在一趟的比较过程中,当前关键字值最小的记录位置。 开始将它设定为当前无序区域的第一个位置,即假设这个位置的关键字最小,然后用它与无序区域中其他记录进行比较,若发现有比它的关键字还小的记录,就将index改为这个新的最小记录位置,随后再用a[index]与后面的记录进行比较,并根据比较结果,随时修改index的值,一趟结束后index中保留的就是本趟选择的关键字最小的记录位置。 (3)将index位置的记录交换到无序区的第一个位置,使得有序区扩展了一个记录,而无序区域减少了一个记录。 不断重复 (2)(3),直到无序区域剩下一个记录为止,此时所有的记录已经按关键字从小到大的顺序排列就位。 5.基本操作: voidselectSort(RecTypeR[])/*用直接选择排序对数组R中的记录进行排序*/ {RecTypex; inti,j,k; for(i=1;i {k=i;/*k保存当前排序码最小记录的下标,初值是i*/ for(j=i+1;j<=N;j++) if(R[j].key if(k! =i)/*将排序码最小的记录放到子区间的第一个位置*/ {x=R[i]; R[i]=R[k]; R[k]=x;} } } ⏹堆排序 1.时间复杂度: O(n*log2n) 2.空间复杂度: O (1) 3.稳定性: 不稳定 4.基本思想: 首先将待排序的记录序列构造一个堆,此时,选出了堆中所有记录的最小者或最大者,然后将它从堆中移走,并将剩余的记录再调整成堆,这样又找出了此小(或次大)得奖了,以此类推,直到堆中只有一个记录为止,每个记录处堆的顺序就是一个有序序列。 5.基本操作: “筛选法”的功能是对R[i]为根结点,其左、右子树已经是堆的完全二叉树调整为堆,其算法的C函数如下: voidheapSift(RecTypeR[],inti,intn)/*R[i]为根结点,调整R[i]~R[n]为大根堆*/ {RecTyperc; intj; rc=R[i]; j=2*i; while(j<=n)/*沿排序码较大的孩子结点向下筛选*/ {if(j j=j+1; if(rc.key>R[j].key)break; R[i]=R[j];/*记录移动到R[i]*/ i=j;j=j*2;}/*调整进入下一层*/ R[i]=rc;/*找到了根结点最后应插入的位置*/ } 下面是堆排序算法heapSort()的C函数,在算法中,建堆和调整堆都需要多次地调用“筛选法”的算法heapSift()。 voidheapSort(RecTypeR[],intn)/*对n个记录进行堆排序*/ {inti; RecTypex; for(i=n/2;i>=1;i--)/*将R[i]~R[n]建成堆*/ heapSift(R,i,n); for(i=n;i>1;i--)/*进行n-1趟排序*/ {x=R[i];R[i]=R[1];R[1]=x;/*堆顶与待排序区最后一个记录交换位置*/ heapSift(R,1,i-1);/*将R[1]~R[i-1]重新调整为堆*/ } } ⏹归并排序 6.时间复杂度: O(n*log2n) 2.空间复杂度: O(n) 3.稳定性: 稳定 4.基本思想: 将一个具有n个待排序记录的序列看成是只能做个长度为1的有序序列,然后进行两两归并,得到n/2个长度为2的有序序列,再进行两两归并,得到n/4个长度为4的有序序列,如此重复,直到得到一个长度为n的有序序列为止。 5.基本操作: voidmerge(RecTypeR[],RecTypeA[],intu,intv,intt)/*将两个有序表R[u]~R[v]和R[v+1]~R[t]归并到有序表A[u]~A[t]*/ {inti,j,k; for(i=u,j=v+1,k=u;i<=v&&j<=t;k++) {if(R[i].key<=R[j].key) {A[k]=R[i]; i++;} else{A[k]=R[j]; j++;} } while(i<=v)/*处理第一个有序表中剩余的记录*/ {A[k]=R[i]; i++;k++; } while(j<=t)/*处理第二个有序表中剩余的记录*/ {A[k]=R[j]; j++;k++; } } 下面给出实现一趟归并排序算法的C函数: voidmergePass(RecTypeR[],RecTypeA[],intn,intlen)/*把数组R中每一个长度为len的有序子表归并到数组A中*/ {intp,i; for(p=1;p+2*len-1<=n;p=p+2*len) merge(R,A,p,p+len-1,p+len*2-1);/*归并长度为len等长有序表*/ if(p+len-1 merge(R,A,p,p+len-1,n);/*归并剩余的两个不等长的有序表*/ else for(i=p;i<=n;i++)/*把剩余的一个有序表复制到数组A中*/ A[i]=R[i]; } 归并排序的过程就是反复地调用一趟归并排序算法,其算法的C函数如下: voidmergeSort(RecTypeR[],intn)/*对数组R进行归并排序*/ {RecTypeA[N+1];/*A是辅助数组*/ intlen,i; len=1; while(len {mergePass(R,A,n,len); len=2*len; mergePass(A,R,n,len); len=2*len; } } 5.测试结果及运行效果 列出你的测试结果,包括输入和输出.这里的测试数据应该完整和严格,最好多于需求分析中所列。 主菜单: 插入类菜单: 交换类菜单: 选择类菜单: 归并菜单: 直接插入排序运行结果: 快速排序运行结果: 堆排序运行结果: 归并排序运行结果: 数据结构课程设计总结: 课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。 通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。 在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。 同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢! 指导教师评语: 成绩评定: 指导教师签字: 2010年01月08日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)