




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计报告-数据结构学院:软件学院班级:11级二班学号:54110211姓名:刘海鲸辅导老师:刘亚波老师数据结构课程设计报告姓名:刘海鲸学号:54110211实验室:座位号:提交日期:2013.3.13成绩:指导教师:刘亚波问题解析(对问题的分析、解题思路与解题方法):实验目的为使我们学习完数据结构课程后,全面深入理解数据结构知识,掌握应用技巧,提高应用与分析能力,并培养学生综合运用所学理论知识求解问题的能力和协作精神。解题思路(分析):题目要求独立编写程序,完成对起泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序6种内排序算法的比较,并且使用至少5组不同的输入数据(记录个数不小于1000个,其中包括完全正序,完全逆序和无序情况)进行排序,比较各组记录与各种排序方法在关键字比较次数和关键字移动次数这两个指标上的差异。因此只需对文件进行排序并计算出两项指标针对某一组特定数据在不同排序方法中的值,既可以完成题目要求。编写正确的排序算法,使用程序读取不同文件,并定义变量,记录排序过程中两项指标的值,就是本题的解题思路。解题方法:使用Code:blocks作为本次实验的开发工具,使用C+完成程序。首先使用数据产生程序来产生所需的5个数据文件,使用了C+中cstdlib文件中的rand()函数和srand()函数共同产生3组伪随机数;在另一个工程中创建了data.h与control.h两个头文件和main.cpp源文件,其中data.h定义了数据类型(模板类),包括主要的排序函数和数据成员,control.h定义了控制类,来完成界面控制,数据文件读取和排序功能的实现,main.cpp是对控制类对象的控制函数conmian()的调用来完成整个程序。最后运行程序来完成对比较指标的统计并进行分析,对得出结果进行解释。任务分工:本实验由本人独立完成。进度安排:为第一次实验课将6个内排序算法完成并调试成功,周末之前完成界面控制并对排序结果进行分析,第二次实验之前完成课程设计报告,第二次试验对程序结果进行最后检查并提交实验报告。数据结构选择(包括改进或给出):使用数组作为本实验基本的数据结构,数据类中包含有数组的头指针head,在初始化时动态申请数组空间,此外还有count(整型)用于记录数组个数,同时可以对数组进行6种内排序及显示数组元素的操作。算法设计:借助课本与网络,使用C+编写算法,详细请看后面程序清单。编程与程序清单:1./头文件data.h2./文件数据类Data定义3. /起泡排序(升序)4. /直接插入排序(升序)5. /简单选择排序(升序)6. /快速排序(升序)7./快速排序的递归函数8./希尔排序 (升序)9./插入排序(升序)10. /堆排序(升序)11./控制类12. /功能选择13./主函数1./头文件data.h 1./头文件data.h#ifndef DATA_H_INCLUDED#define DATA_H_INCLUDED#include#includeusing namespace std;2./文件数据类Data定义templateclass Data private: T *head; /数据数组指针,用于动态申请数组空间 int count; /数组大小 public: /构造函数,使指针为空 Data()head=NULL; /用已有数组构造数组元素,当前程序使用该函数来构造数据元素 void copy(T *h,int c=1000) if(head!=NULL) delete head; head=h;count=c; head=new Tcount; for(int i=0;icount;i+) headi=hi; /手动输入各元素,当前程序未使用,调试程序时使用! void set() if(head!=NULL) delete head; cout请输入数据个数:count; head=new Tcount; cout请输入数据:endl; for(int i=0;iheadi; /析构函数,回收空间 Data()delete head;3. /起泡排序(升序) void bSort() if(isEmpty()cout 文件中无记录,无法排序!endl;return; int compareTime=0; /关键词比较次数 int moveTime=0; /关键词移动次数 int bound=count; int start,finish; /记录程序运行时间 T temp; cout 正在排序.endl; start=clock(); /记录初始时间 /算法主体 while(bound!=0) int t=0; for(int i=0;iheadi+1) temp=headi; headi=headi+1; headi+1=temp; t=i+1; moveTime+=3; /记录交换一次移动次数加3 bound=t; finish=clock(); cout排序后结果为:endl; display(); /输出排序后序列 coutendl *-endl *关键词比较次数:compareTimeendl *记录移动次数:moveTimeendl *排序执行时间:finish-startmsendl *-endlendl; 4. /直接插入排序(升序) void iSort() if(isEmpty()cout 文件中无记录,无法排序!endl; int compareTime=0; int moveTime=0; long start,finish; T temp; cout 正在排序.endl; start=clock(); for(int i=1;i=0&headjtemp) compareTime+; headj+1=headj; moveTime+; /记录向后移一位,移动次数加1 j-; compareTime+; /跳出循环后比较次数要再加1 headj+1=temp; moveTime+; finish=clock(); cout排序后结果为:endl; display(); coutendl *-endl *关键词比较次数:compareTimeendl *记录移动次数:moveTimeendl *排序执行时间:(finish-start)msendl *-endlendl; 5. /简单选择排序(升序) void sSort() if(isEmpty()cout 文件中无记录,无法排序!endl; int compareTime=0; int moveTime=0; long start,finish; T temp; cout 正在排序.endl; start=clock(); for(int i=0;icount-1;i+) int j=i; for(int k=i+1;kheadk) j=k; /标记当前最大的记录下标 if(i!=j) temp=headi; headi=headj; headj=temp; moveTime+=3; finish=clock(); cout排序后结果为:endl; display(); coutendl *-endl *关键词比较次数:compareTimeendl *记录移动次数:moveTimeendl *排序执行时间:(finish-start)msendl *-endlendl; 6. /快速排序(升序) void qqSort() if(isEmpty()cout 文件中无记录,无法排序!endl; long start,finish; int times2=0,0; /要调用函数,故使用数组来记录关键词的比较次数和移动次数,直接进行计数 start=clock(); cout 正在排序.endl; qSort(head,0,count,times); /一趟快速排序函数 finish=clock(); cout排序后结果为:endl; display(); coutendl *-endl *关键词比较次数:times0endl *记录移动次数:times1endl *排序执行时间:(finish-start)msendl *-endlendl; 7./快速排序的递归函数 void qSort(T *head,int m,int n,int *times) int i=m,j=n; T temp=headm,t=m; if(m=n) while(ij) i=i+1; while(headitemp&j!=m)times0+;j-; if(ij) t=headi; headi=headj; headj=t; times1+=3; if(m!=j) t=headm; headm=headj; headj=t; times1+=3; qSort(head,m,j,times); qSort(head,j+1,n,times); 8./希尔排序 (升序) void shell() if(isEmpty()cout 文件中无记录,无法排序!endl; int times2=0,0; int seq8=701,301,132,57,23,10,4,1; /依据课本得到希尔排序最优的增量递减序列 long start,finish; cout 正在排序.endl; start=clock(); int n; for(int i=0;i8;i+) n=seqi; insert(n,times); /调用插入排序算法对同组数据进行排序 finish=clock(); cout排序后结果为:endl; display(); coutendl *-endl *关键词比较次数:times0endl *记录移动次数:times1endl *排序执行时间:(finish-start)msendl *-endlendl; 9./插入排序(被希尔排序shell函数调用) void insert(int n,int * times) /增量为n带来一系列程序的改动 for(int k=0;k+ncount;k+) T temp; for(int i=k+n;i=k&headjtemp) times0+; headj+n=headj; times1+; j-=n; times0+; headj+n=temp; times1+; 10. /堆排序(升序) void hSort() /堆为完全二叉树,故可用数组构造堆,且不会造成空间的浪费 if(isEmpty()cout 文件中无记录,无法排序!endl; int times2=0,0; T temp; long start,finish; cout 正在排序.0;i-) restore(i,count,times); /排序及重建堆 for(int i=count;i1;i-) temp=head0; head0=headi-1; headi-1=temp; times1+=3; restore(1,i-1,times); finish=clock(); cout排序后结果为:endl; display(); coutendl *-endl *关键词比较次数:times0endl *记录移动次数:times1endl *排序执行时间:(finish-start)msendl *-endlendl; /重建堆算法(被堆排序hSort函数调用) void restore(int a,int b,int * times) int mark,j=a; T temp; while(j=b/2) if(2*jb&head2*j-1headj-1) temp=headmark; headmark=headj-1; headj-1=temp; j=mark+1; times0+; times1+=3; else j=b; /人为改变j的值,跳出循环,退出程序 times0+; /输出记录序列(升序) void display() for(int i=0;icount;i+) coutheadi ; coutendl; /判断数据是否为空 bool isEmpty()constreturn head=NULL; /获得头指针,本程序未使用! T *getHead()return head; /获得数组元素个数,本程序未使用! int getCount ()constreturn count;#endif / DATA_H_INCLUDED/头文件control.h#ifndef CONTROL_H_INCLUDED#define CONTROL_H_INCLUDED#includedata.h#include#include /含有istringstream类#includeusing namespace std;11./控制类,进行界面管理,记录文件读取,调用排序函数等操作class Control public: void conmain() /控制函数 cout# #【数据结构课程设计(一):内排序算法比较】# #; cout#使用说明:运行程序,请输入数据文件名(a.txt,b.txt,c.txt均为无序数据,d.txt为完# #全正序数据,e.txt为完全逆序文件,均存放在当前目录下),之后请按照用户个人需求 # #选择相应功能! # # #endl 功能列表 #endl #endl # 1.起泡排序 (升序) #endl # 2.直接插入排序(升序) #endl # 3.简单选择排序 (升序) #endl # 4.快速排序(升序) #endl # 5.希尔排序(升序) #endl # 6.堆排序(升序) #endl # 0.退出 #endl #endl;/定义选择变量及辅助变量int opt1,a,i=0;/数组存储数据int data1000;/定义Data类对象Data temp;/文件名string file; /读取文件,从输入的文件名中读取数据,a.txt,b.txt,c.txt为随机数据,e.txt为正序,e.txt为逆序coutendl请输入目标数据文件:; cinfile; ifstream in(file.c_str(); /string类转换为字符串且在末尾加0 for(string s;getline(in,s);) /读取文件,读取整行,使用istringstream类读出数字(可自动忽略数字间的空格) for(istringstream sin(s);sina;); datai+=a; 12. /功能选择coutendl请选择功能(输入对应功能的序号):;cinopt1;while(opt1)switch(opt1) /调用起泡排序函数case 1:temp.copy(data);temp.bSort();break; /调用直接插入排序函数case 2:temp.copy(data);temp.iSort();break; /调用简单选择排序函数case 3:temp.copy(data);temp.sSort();break; /调用快速排序函数 case 4:temp.copy(data);temp.qqSort();break; /调用Shell排序函数 case 5:temp.copy(data);temp.shell();break; /调用堆排序函数 case 6:temp.copy(data);temp.hSort();break; |endl -endl; cout #endl 功能列表 #endl #endl # 1.起泡排序 (升序) #endl # 2.直接插入排序(升序) #endl # 3.简单选择排序 (升序) #endl # 4.快速排序(升序) #endl # 5.希尔排序(升序) #endl # 6.堆排序(升序) #endl # 0.退出 #endl #endl;coutendl请选择功能(输入对应功能的序号):;cinopt1;cout#endl; ;#endif / CONTROL_H_INCLUDED/源文件main.cpp#includedata.h#includecontrol.h#includeusing namespace std;12./主函数int main() Control a; /控制类Control类对象 a.conmain(); /控制函数 return 0;测试方法:使用排序程序前,先使用数据产生程序generator产生所需数据(整型,1000个记录),包括3组无序数据(用rand()与srand()函数产生),一组完全正序数据和一组完全逆序数据,并分别存储于5个不同的文本文件中。在排序程序中依次读取5个数据文件并按照程序的提示对数据进行排序,观测输出的排序序列并对关键词比较次数和关键词移动次数进行分析。测试数据:由数据产生程序generator产生,存储于文件由数据产生程序generator产生,存储于文件a.txt,b.txt,c.txt,d.txt,e.txt(前三个为无序记录文件,第四个为完全正序文件,第五个为完全逆序文件)中,记录为整型数据, 规模为1000数量级。测试结果:起泡排序数据组别比较次数/次移动次数/次排序时间/ms理论值(最好,最坏,平均)O(n),O(n2),O(n2)0,O(n2),O(n2)-a49729676015212b49713975650716c49559674349912d99901e499500149850014直接插入排序数据组别比较次数/次移动次数/次排序时间/ms理论值(最好,最坏,平均)O(n),O(n2),O(n2)O(n),O(n2),O(n2)-a2543832553825b2531682541676c2488322498315d99919981e50049950149811简单选择排序数据组别比较次数/次移动次数/次排序时间/ms理论值(最好,最坏,平均)O(n2),O(n2),O(n2)0,O(n),O(n)-a49950029856b49950029766c49950029736d49950007e49950015009快速排序数据组别比较次数/次移动次数/次排序时间/ms理论值(最好,最坏,平均)O(nlog2n),O(nlog2n),O(nlog2n)0,O(nlog2n),O(nlog2n)-a834182953b663983764c759382232d49950005e49950015006Shell排序数据组别比较次数/次移动次数/次排序时间/ms理论值(最好,最坏,平均)O(n(log2n)2)O(n(log2n)2)-a714181142199923b714136142195422c714210142202821d707818141563622e710908141872621堆排序数据组别比较次数/次移动次数/次排序时间/ms理论值(最好,最坏,平均)O(nlog2n)O(nlog2n)-a16892272611b16834271951c1683627159115982249481程序的使用说明:运行程序,输入数据文件名(a.txt,b.txt,c.txt均为无需记录文件 ,d.txt为完全正序记录文件,e.txt为完全逆序记录文件,均存放在当前目录下),之后请用户按照个人需求及程序界面提示选择相应排序功能,完成排序,并查看关键词的比较次数,交换次数和排序时间!每次运行只能读取一个文件,可多次进行排序。需要多次执行程序以完成对5组记录的排序与各项指标的统计。总结:(对程序进行分析、评价运行效果,总结遇到的问题及解决办法)总体评价:课程设计题目一难
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物流企业员工爱岗敬业与物流效率提升协议
- 水面承包经营权流转与生态修复项目合作协议
- 遗赠抚养协议示范文本:子女赡养与财产继承指导书
- 初高中教师选调与教师职业素养提升服务合同
- 5G通信网络扩建项目电杆与管道材料购销服务合同
- 网络订餐平台食堂外卖配送员聘用服务合同
- 城市地下管网改造项目建议书与政府投资协议
- 现代农业苗木种植基地场地租赁与农业科技创新合同
- 酒店会议场地租赁及专业会议策划执行合同
- 昆山物业费退还判决书合同要点与执行流程
- 钢结构雨棚作业安全技术交底
- 《旅游学概论》课件-《旅游学概论》 第一章 旅游的产生与发展
- 电力隐患培训课件
- 女性私密项目培训
- 2025年《审计理论与实务(中级)》考前几页纸
- 北京高考英语一轮专项复习:词汇-高频短语(含解析)
- 砂石采购合同范本
- 幼儿园课程实施方案
- 学校食堂操作流程培训
- 2025年四川省水电投资经营集团有限公司招聘笔试参考题库含答案解析
- 医德医风领导小组制度及职责
评论
0/150
提交评论