版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、(完整)数据结构(c语言版)实验报告 (内部排序算法比较)(完整)数据结构(c语言版)实验报告 (内部排序算法比较) 编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)数据结构(c语言版)实验报告 (内部排序算法比较))的内容能够给您的工作和学习带来便利。同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快 业绩进步,以下为(完整)数据结构(c语言版)实验报告 (内部排序算法
2、比较)的全部内容。数据结构与算法实验报告一、 需求分析问题描述:在教科书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受.基本要求:(l)对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。 (2)待排序表的表长不小于100000;其中的数据要用伪随机数程序产生;至少要用5组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)。 (3)最后要对结果作简单分析,包括对各组数据得出结果波动大小的
3、解释。数据测试: 二概要设计1. 程序所需的抽象数据类型的定义: typedef int bool; /说明bool是int的别名 typedef struct studentdata int num; /存放关键字 data; typedef struct linklist int length; /数组长度 data recordmaxsize; /用数组存放所有的随机数 linklist int randarraymaxsize; /定义长度为maxsize的随机数组 void randomnum() /随机生成函数 void initlinklist(linklist* l) /初始化
4、链表 bool lt(int i, int j,int* cmpnum) /比较i和j 的大小 void display(linklist* l) /显示输出函数 void shellsort(linklist* l, int dlta, int t,int cmpnum, int* chgnum) /希尔排序 void quicksort (linklist l, int* cmpnum, int chgnum) /快速排序 void heapsort (linklist* l, int* cmpnum, int chgnum) /堆排序 void bubblesort(linklist l
5、, int* cmpnum, int chgnum) /冒泡排序 void selsort(linklist* l, int* cmpnum, int chgnum) /选择排序 void compare(linklist* l,int cmpnum, int* chgnum) /比较所有排序 2 .各程序模块之间的层次(调用)关系:二、 详细设计typedef int bool; /定义标识符关键字bool别名为int typedef struct studentdata /记录数据类型 int num; /定义关键字类型 data; /排序的记录数据类型定义 typedef struct
6、linklist /记录线性表 int length; /定义表长 data recordmaxsize; /表长记录最大值 linklist; /排序的记录线性表类型定义 int randarraymaxsize; /定义随机数组类型及最大值 /*随机生成函数*/ void randomnum() int i; srand(int)time(null)); /用伪随机数程序产生伪随机数 for(i=0; i小于maxsize; i+) randarrayi=(int)rand(); 返回; /*初始化链表*/ void initlinklist(linklist l) /初始化链表 int
7、i; memset(l,0,sizeof(linklist); randomnum(); for(i=0; i小于maxsize; i+) lrecordi。numlength=i; bool lt(int i, int j,int* cmpnum) (cmpnum)+; 若ilength; i+) fprintf(f,”dn,lrecordi。num); 通过文件指针f关闭文件; 三、 调试分析1. 调试过程中遇到的问题及经验体会: 在本次程序的编写和调试过程中,我曾多次修改代码,并根据调试显示的界面一次次调整代码。在调试成功之前,我的程序因为3个错误而无法运行,在经过完整并且仔细的检查后,
8、发现3处错误分别是没有定义变量就直接套用、忘记加指针符号、忘记在嵌套语句后加大括号,这些看似不显眼的小问题却导致整个程序无法运行,所以我认为在编程过程中要及其严谨,尽量少犯或避免犯语法错误,保证代码的完整性。 2. 算法的时空分析: 1。稳定性比较: 插入排序、冒泡排序、简单选择排序及其他线形排序是稳定的; 希尔排序、快速排序、堆排序是不稳定的。 2.时间复杂性比较: 插入排序、冒泡排序、选择排序的时间复杂性为o(n2); 其它非线形排序的时间复杂性为o(nlog2n); 线形排序的时间复杂性为o(n)。 3.辅助空间的比较: 线形排序的辅助空间为o(n),其它排序的辅助空间为o(1). 4.
9、其它比较: 插入、冒泡排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度。反而在这种情况下,快速排序反而慢了: 当n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序; 当n较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。 当n较大时,关键字元素可能出现本身是有序的,对稳定性有要求时,空间允许的情况下,宜用归并排序。 当n较大时,关键字元素可能出现本身是有序的,对稳定性没有要求时宜用堆排序.四、 用户守则 1.可执行文件为:a.exe 2。为了界面更加友好特将背景颜色设计为黑色,字体为白色。 3。进入演示程序后即显示文本形式的用户界面,再
10、按提示一步步完成:五、 测试结果测试结果及其分析: 通过本次程序的运行,得到数据:插入排序:比较的次数为25114496,交换的次数为25094525,花费的时间为1203ms;希尔排序:比较的次数为3834939,交换的次数为3782098,花费的时间为187ms;快速排序:比较的次数为153398,交换的次数为62804,花费的时间为0ms;堆排序:比较的次数为235273,交换的次数为124235,花费的时间为16ms;冒泡排序:比较的次数为49995000,交换的次数为27537172,花费的时间为2969ms;选择排序:比较的次数为50005000,交换的次数为9988,花费的时间为
11、1656ms。算法效率是依据算法执行的时间来看的,从上面的数据来看,虽然插入排序的算法简洁,容易实现,但是从它执行的时间1203ms来看它的效率并不是很高,而且比较次数和交换次数都比较多,在这六种排序中效率是很底的;希尔排序的时间复杂度较直接排序低,在六种内部排序中效率居中;分析冒泡排序的效率,容易看出,若初始序列为“正序”序列,则只进行一趟排序,在排序过程中进行n1次关键字的比较,反之,则需进行n-1趟排序,总的时间复杂度为o(n2),在该程序中,冒泡排序所花费的时间为4360,是所有排序中花费最多的,可见效率是很底的。快速排序是对冒泡排序的一种改进,它所用的时间几乎为0,交换的比较的次数都
12、比较少;堆排序仅次于快速排序,花费的时间只有16ms.由以上讨论可知,从时间上看,快速排序的平均性能都优于其他5种排序.算法时间复杂度分析如下:1、直接插入排序:当文件的初始状态不同时,直接插入排序所耗费的时间是有很大差异的。最好情况是文件初态为正序,此时算法的时间复杂度为o(n),最坏情况是文件初态为反序,相应的时间复杂度为o(n2),算法的平均时间复杂度是o(n2);2、选择排序是不稳定的,算法复杂度为o(n2);3、快速排序是不稳定的主体算法时间运算量约o(log2n),划分子区函数运算量约o(n),所以总的时间复杂度为o(nlog2n),它显然优于冒泡排序o(n2);4、希尔排序是不稳
13、定的,算法复杂度是n1。251。6*n1.25;5、冒泡排序是稳定的,时间复杂度为o(n2);6、堆排序是不稳定的。对各种表长和测试组数进行了测试,程序运行正常.分析实测得到的数值,6种排序算法的特点小结如下:(1)若n较小(如n50),可采用直接插入或直接选择排序.当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜; (2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜; (3)若n较大,则应采用时间复杂度为o(nlgn)的排序方法:快速排序、堆排序或归并排序; 快速排序是目前基于比较的内部排序中被认为是最好的方法
14、,当待排序的关键字是随机分布时,快速排序的平均时间最短;堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。六、 附录(源代码) include include # include windows。h include winbase.h define maxsize 10000 /线性表中最多元素个数 define true 1 define false 0 typedef int bool; /定义标识符关键字bool别名为int typedef struct studentdata /记录数据类型 int num; /定义关键字类型 data;
15、 /排序的记录数据类型定义 typedef struct linklist /记录线性表 int length; /定义表长 data recordmaxsize; /表长记录最大值 linklist; /排序的记录线性表类型定义 int randarraymaxsize; /定义随机数组类型及最大值 /*随机生成函数*/ void randomnum() /随机生成函数 int i; srand(int)time(null); /用伪随机数程序产生伪随机数 for(i=0; imaxsize; i+) randarrayi=(int)rand(); return; /*初始化链表*/ voi
16、d initlinklist(linklist* l) /初始化链表 int i; memset(l,0,sizeof(linklist); randomnum(); /调用随机函数 for(i=0; irecordi。num=randarrayi; l-length=i; bool lt(int i, int j, int* cmpnum) (*cmpnum)+; if (ij) return true;return false; void display(linklist* l) file f; /定义一个文件指针f int i; if((f=fopen(”sortres。txt,w)=n
17、ull) /通过文件指针f打开文件为条件判断 /是否应该打开文件 printf(cant open filen”); exit(0); for (i=0; il-length; i+) fprintf(f,”dn”,l-recordi.num); fclose(f); /通过文件指针f关闭文件 /*冒泡排序*/ void bubblesort(linklist l, int* cmpnum, int chgnum) int i,j; data temp; for (i=0; imaxsize1;i+) for(j=0; jrecordj,sizeof(data); memcpy(&l-reco
18、rdj,&lrecordj+1,sizeof(data)); memcpy(&l-recordj+1,&temp,sizeof(data)); /*选择排序*/ int selectminkey(linklist l,int k,int* cmpnum) int min=k;for ( klength; k+) if(!lt(l-recordmin。num,lrecordk。num,cmpnum)) min=k; return min; void selsort(linklist* l, int cmpnum, int chgnum) int i, j; data temp; for(i=0;
19、 il-length; i+) j=selectminkey(l,i,cmpnum); if(i!=j) (*chgnum)+; memcpy(&temp,l-recordi,sizeof(data); memcpy(&lrecordi,&l-recordj,sizeof(data); memcpy(&l-recordj,&temp,sizeof(data)); /*快速排序*/ int partition (linklist l, int low, int high, int* cmpnum, int chgnum) data temp;int pivotkey; memcpy(temp,&
20、lrecordlow,sizeof(data)); pivotkey=l-recordlow。num; while (low high) while (lowrecordhigh.num = pivotkey) high; (*cmpnum)+; (chgnum)+; memcpy(lrecordlow,lrecordhigh,sizeof(data));while (lowhigh & l-recordlow.num = pivotkey) low+; (*cmpnum)+; (chgnum)+; memcpy(&lrecordhigh,&l-recordlow,sizeof(data));
21、 memcpy(l-recordlow,&temp,sizeof(data)); return low; void qsort (linklist l, int low, int high, int* cmpnum, int chgnum) int pivotloc=0; if (low high) pivotloc=partition(l,low,high,cmpnum,chgnum); qsort(l,low,pivotloc1,cmpnum,chgnum); qsort(l,pivotloc+1,high,cmpnum,chgnum); void quicksort (linklist
22、l, int cmpnum, int* chgnum) qsort(l,0,llength-1,cmpnum,chgnum); /*希尔排序*/ void shellinsert(linklist* l,int dk, int cmpnum, int chgnum) int i, j; data temp; for(i=dk; irecordi,sizeof(data)); for(j=i-dk; j=0 lt(temp。num, lrecordj.num, cmpnum) j-=dk) (chgnum)+; memcpy(l-recordj+dk,&l-recordj,sizeof(data
23、); memcpy(l-recordj+dk,&temp,sizeof(data)); void shellsort(linklist* l, int dlta, int t,int* cmpnum, int chgnum) int k; for (k=0; kt; k+) shellinsert(l,dltak,cmpnum,chgnum); /*堆排序*/ void heapadjust (linklist* l,int s, int m, int cmpnum, int chgnum) data temp; int j=0; s+; memcpy(temp,&lrecords1,size
24、of(data); for (j=2*s; j=m j*=2) if(jrecordj1。num,lrecordj。num,cmpnum) +j; if(!lt(temp.num,l-recordj1.num,cmpnum) break; (chgnum)+; memcpy(l-records1,l-recordj1,sizeof(data); s=j; memcpy(l-records-1,temp,sizeof(data); void heapsort (linklist l, int cmpnum, int* chgnum) int i=0; data temp; for (i=llen
25、gth/21; i=0; i-) heapadjust(l,i,llength,cmpnum,chgnum); for (i=l-length; i1; i-) memcpy(&temp,l-record0,sizeof(data); (chgnum)+;memcpy(&lrecord0,&l-recordi1,sizeof(data); memcpy(&lrecordi1,&temp,sizeof(data); heapadjust(l,0,i1,cmpnum,chgnum); /*比较所有排序*/ void compare(linklist* l,int* cmpnum, int chgn
26、um) int temptime,i; int spendtime; int dlta3=7,3,1; int indata1=1; temptime=(int)gettickcount(); shellsort(l,indata,1,&cmpnum0,chgnum0); spendtime=(int)gettickcount()temptime; printf(”nt=); printf(”nnt插入排序:); printf(nt比较的次数=dt交换的次数=%dt所用的时间 =%dms,cmpnum0,chgnum0,spendtime); for(i=0; irecordi.num=ran
27、darrayi; /随机数列复位 temptime=(int)gettickcount(); shellsort(l, dlta, 3,&cmpnum1,&chgnum1); spendtime=(int)gettickcount()temptime; printf(nnt希尔排序:”); printf(nt比较的次数=dt交换的次数=%dt所用的时间 =dms”,cmpnum1,chgnum1,spendtime); for(i=0; irecordi。num=randarrayi; /随机数列复位 temptime=(int)gettickcount(); heapsort(l,&cmpnum3,chgnum3); spendtime=(int)gettickcount()-temptime; printf(”nnt堆排序:”); printf(”nt比较的次数=%dt交换的次数=%dt所用的时间 =%dms,cmpnum3,chgnum3,spendtime); for(i=0; imaxsize; i+) lrecordi。num=randarrayi; /随机数列复位 tempti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【新教材】统编版(2024)八年级下册历史 第14课 国防和外交工作新局面 教案
- 2026年小微权力清单
- 建筑施工物料提升机安全隐患大排查自查报告
- 科创园区安保辅警考试题及答案
- 2026年通信工程师考试真题解析
- 临床路径管理考试题及答案
- 树枝状大分子:结构、合成与应用的多维度理论剖析
- 柴达木盆地南翼山油田水:水化学与氢氧同位素的地球化学解析
- 柳州市园博园:景观多维评价与会后创新利用探索
- 柚子中活性成分提取、分离与分析方法的多维度探究
- 2026年行政后勤岗位考试试题及答案
- 矿井防突培训工作制度
- 2026年及未来5年市场数据中国聚苯乙烯行业发展监测及投资战略咨询报告
- 简明精神病评定量表(BPRS)
- 河北二次报销制度
- 2025年榆林旅投集团招聘(25人)笔试参考题库附带答案详解
- 2026秋招:内蒙古森林工业集团笔试题及答案
- 骨科脊柱手术围术期护理规范
- 港口设施保安课件
- 围餐酒席合同协议书
- 《住改商业主知情同意书》
评论
0/150
提交评论