ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:207.99KB ,
资源ID:11639410      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11639410.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(《数据结构》内部排序12种算法上机实验报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

《数据结构》内部排序12种算法上机实验报告.docx

1、数据结构内部排序12种算法上机实验报告成都信息工程学院计算机系课程实验报告实验课程:数据结构实验项目:实现算法的全排序指导教师: 学生姓名: 学生学号:班 级:计算机工程1班实验地点: 6305实验时间:2012年 12月2日 12月19日实验成绩:评阅老师:(说明:实验报告必须包含下面的每项内容,根据实验情况认真填写,封面必须打印或复印(A4纸),书写上机实验报告内容的纸张也用A4纸,最后从侧面装订)一【上机实验目的】目的:从键盘输入一组数,通过内部排序的12种算法对这组数字进行排序。熟练掌握刚刚学过的内部排序的算法,并对这12种排序算法的时间复杂度进行比较,根据不同的情况,选择合适的算法二

2、【实验环境】PC机每人1台三【上机实验内容】实现内部排序的12种排序算法的全排序。四【上机调试程序流程图】(注:可打印)(用传统流程图的形式表示) 五【上机调试中出现的错误信息、错误原因及解决办法】(记录下你调试程序中出现的错误信息的英文提示,分析出错原因及可能的解决办法)六【上机调试后的源程序及还存在的问题】(注:源程序可打印)(同时记录下你对你编写此程序的其它具体想法,)主要的程序:/*直接插入排序*/void InsertSort(SqList &L)/直接插入排序 int i,j; for(i=2;i=L.length;+i) if(L.ri.key=L.ri-1.key) L.r0=

3、L.ri; L.ri=L.ri-1; for(j=i-2;(L.r0.keyL.rj.key);-j) L.rj+1=L.rj; L.rj+1=L.r0; /*折半插入排序*/void BinsertSort(SqList &L)/折半插入排序 int i,j,low,high,m; for(i=2;i=L.length;i+) L.r0=L.ri; low=1; high=i-1; while(low=high) m=(low+high)/2; if(L.r0.key=high+1;-j) L.rj+1=L.rj; L.rhigh+1=L.r0; /*2-路插入排序*/void P2_Ins

4、ertSort(SqList &L) /2路插入排序 int i,j,first,final; RedType *d; d=(RedType*)malloc(L.length*sizeof(RedType); /生成L.length个记录的临时空间 d0=L.r1; first=final=0; / first、final分别指示d中排好序的记录的第1个和最后1个记录的位置 for(i=2;i=L.length;+i) /依次将L的第2个最后1个记录插入d中 if(L.ri.keydfinal.key) /待插记录大于d中最大值,插到dfinal之后(不需移动d数组的元素) final=fin

5、al+1; dfinal=L.ri; else /待插记录大于d中最小值,小于d中最大值,插到d的中间(需要移动d数组的元素) j=final+; / 移动d的尾部元素以便按序插入记录 while(L.ri.keydj.key) d(j+1)%L.length=dj; j=(j-1+L.length)%L.length; dj+1=L.ri; for(i=1;i=L.length;i+) / 把d赋给L.r L.ri=d(i+first-1)%L.length; /线性关系 /*希尔排序*/void ShellInsert(SqList &L,int dk)/ printf(OK); int

6、i,j; for(i=dk+1;i=L.length;i+) if(L.ri.key0&(L.r0.keyL.rj.key);j=j-dk) L.rj+dk=L.rj; L.rj+dk=L.r0; void ShellSort(SqList &L,int dlta,int t)/ printf(OK); int k; for(k=0;kt;+k) ShellInsert(L,dltak);/ display(L);/*表插入排序*/void TableInsert(SLinkListType &SL,RedType D) /由数组D建立的n个元素的表插入排序的静态链表SL int i,p,q;

7、 SL.r0.rc.key=INT_MAX; /表头结点记录的关键字取得最大整数(非降序表的表尾) SL.r0.next=0; /next域为0表示表尾(现为空表,初始化) for(i=0;iMAXSIZE;i+) SL.ri+1.rc=Di; /将数组D的值赋给静态链表SL q=0; p=SL.r0.next; while(SL.rp.rc.key=SL.ri+1.rc.key) /静态链表后移 q=p; p=SL.rp.next; SL.ri+1.next=p; SL.rq.next=i+1; /将当前记录插入到静态链表 SL.length=MAXSIZE;void Arrange(SLi

8、nkListType &SL)/根据静态链表SL中各结点的指针值调整记录位置,使得SL中记录按关键字非递减有序排列 int i,p,q; SLNode t; p=SL.r0.next; /p指示第一个记录的当前位置 printf(%d ,SL.length); for(i=1;iSL.length;i+) /SL.ri.i-1中记录已按关键字有序排列,第i个记录在SL中的当前记录不应小于i while(p=1&k;-i) k=0; for(int j=1;jL.rj+1.key) tem=L.rj; L.rj=L.rj+1; L.rj+1=tem; k=1; /*快速排序*/int Parti

9、tion(SqList &L,int low,int high)/快速排序递归函数的实现 int pivotkey; L.r0=L.rlow; pivotkey=L.rlow.key; while(lowhigh) while(low=pivotkey) -high; L.rlow=L.rhigh; while(lowhigh&L.rlow.key=pivotkey) +low; L.rhigh=L.rlow; L.rlow=L.r0; return low;/*简单选择排序*/int SelectMinKey(SqList &L,int i) int j,k=i; for(j=i+1;jL.

10、rj.key) k=j; return k;void Select_Sort(SqList &L) int i,j; RedType tem; for(i=1;iL.length;i+) j=SelectMinKey(L,i); if(i!=j) tem=L.ri; L.ri=L.rj; L.rj=tem; /*堆排序*/void HeapAdjust(HeadType &L,int s,int m)/对生成的堆进行排序,生成大顶堆 RedType rc; rc=L.rs; int j; for(j=2*s;j=m;j*=2) if(jm&(L.rj.key=L.rj.key) break;

11、L.rs=L.rj; s=j; L.rs=rc;void HeadSort(HeadType &L)/对一组无序的数字进行排序生成堆 int i; RedType temp; for(i=L.length/2;i0;-i) HeapAdjust(L,i,L.length); for(i=L.length;i1;-i) temp=L.r1; L.r1=L.ri; L.ri=temp; HeapAdjust(L,1,i-1); /*归并排序*/void Merge(RedType SR,RedType TR,int s,int m,int t)/printf(+_+_+_+_+_+_); int

12、i,j,k;/ RcdType *tem; for(j=m+1,k=s,i=s;i=m&j=t;k+) if(SRi.keySRj.key) TRk=SRi+; else TRk=SRj+; while(i=m) / for(l=0;lm-1;l+,k+,i+) TRk+=SRi+; while(j=t) / for(l=0;ln-j;l+,k+,j+) TRk+=SRj+; void MSort(RedType SR,RedType TR1,int s,int t) int m; RedType TR2MAXSIZE+1; if(s=t) TR1s=SRs; else m=(s+t)/2;

13、MSort(SR,TR2,s,m); MSort(SR,TR2,m+1,t); Merge(TR2,TR1,s,m,t); void MergeSort(SqList &L) MSort(L.r,L.r,1,L.length);/*基数排序*/oid InitList(SLList &L,RedType D,int n) / 初始化静态链表L(把数组D中的数据存于L中) char cMAX_NUM_OF_KEY,c1MAX_NUM_OF_KEY; int i,j,max=D0.key; / max为关键字的最大值 for(i=1;in;i+) if(maxDi.key) max=Di.key;

14、 L.keynum=int(ceil(log10(max); L.recnum=n; for(i=1;i=n;i+) L.ri.otheritems=Di-1.otherinfo; itoa(Di-1.key,c,10); / 将10进制整型转化为字符型,存入c for(j=strlen(c);jL.keynum;j+) / 若c的长度max的位数,在c前补0 strcpy(c1,0); strcat(c1,c); strcpy(c,c1); for(j=0;jL.keynum;j+) L.ri.keysj=cL.keynum-1-j; void Distribute(SLCell r,int

15、 i,ArrType f,ArrType e) / 算法10.15 / 静态键表L的r域中记录已按(keys0,keysi-1)有序。本算法按 / 第i个关键字keysi建立RADIX个子表,使同一子表中记录的keysi相同。 / f0.RADIX-1和e0.RADIX-1分别指向各子表中第一个和最后一个记录 int j,p; for(j=0;jRADIX;+j) fj=0; / 各子表初始化为空表 for(p=r0.next;p;p=rp.next) j=rp.keysi-0; / 将记录中第i个关键字映射到0.RADIX-1 if(!fj) fj=p; else rej.next=p; e

16、j=p; / 将p所指的结点插入第j个子表中 void Collect(SLCell r,ArrType f,ArrType e) / 算法10.16 / 本算法按keysi自小至大地将f0.RADIX-1所指各子表依次链接成 / 一个链表,e0.RADIX-1为各子表的尾指针。 int j,t; for(j=0;!fj;j=+j); / 找第一个非空子表 r0.next=fj; t=ej; / r0.next指向第一个非空子表中第一个结点 while(jRADIX-1) for(j=+j;j=0;j-) printf(%c,L.ri.keysj); printf( ); i=L.ri.nex

17、t; void RadixSort(SLList &L) / 算法10.17 / L是采用静态链表表示的顺序表。对L作基数排序,使得L成为按关键字 / 自小到大的有序静态链表,L.r0为头结点。 int i; ArrType f,e; for(i=0;iL.recnum;+i) L.ri.next=i+1; L.rL.recnum.next=0; / 将L改造为静态链表 for(i=0;iL.keynum;+i) / 按最低位优先依次对各关键字进行分配和收集 Distribute(L.r,i,f,e); / 第i趟分配 Collect(L.r,f,e); / 第i趟收集 printf(第%d趟

18、收集后:n,i+1); printl(L); printf(n); void print(SLList L)/ 按数组序号输出静态链表 int i,j; printf(keynum=%d recnum=%dn,L.keynum,L.recnum); for(i=1;i=0;j-) printf(%c,L.ri.keysj); printf( otheritems=%d next=%dn,L.ri.otheritems,L.ri.next); void Sort(SLList L,int adr) / 改此句(类型) / 求得adr1.L.length,adri为静态链表L的第i个最小记录的序号

19、 int i=1,p=L.r0.next; while(p) adri+=p; p=L.rp.next; void Rearrange(SLList &L,int adr) / 改此句(类型) / adr给出静态链表L的有序次序,即L.radri是第i小的记录。 / 本算法按adr重排L.r,使其有序。算法10.18(L的类型有变) int i,j,k; for(i=1;iL.recnum;+i) / 改此句(类型) if(adri!=i) j=i; L.r0=L.ri; / 暂存记录L.ri while(adrj!=i)/ 调整L.radrj的记录到位直到adrj=i为止 k=adrj; L

20、.rj=L.rk; adrj=j; j=k; / 记录按序到位 L.rj=L.r0; adrj=j; 运行效果图:七【上机实验中的其他它问题及心得】(在上机实验中遇到的你不能解决的其它问题,简单描述一下你此次上机的收获及感想)心得:排序时计算机程序设计中的一种重要的操作,因为我们无论做什么样的程序都会涉及到排序算法,在第十章的内部排序算法中,基本上都是一些经典的排序算法,这是我选择这个题目的主要原因,因为通过这个综合设计,我可以了解不同的排序算法,根据不同的情况,选择更好的算法。在本章中共有12种算法:插入排序5种,选择排序3种,快速排序2种,归并排序和基数排序。在没有接触本章之前,我们只是接

21、触了简单的冒泡排序和选择排序,这些只是对数n不是很大的情况,当n值很大时,我们果继续使用这些简单的算法,时间复杂度会很大的。因此,在本章中介绍的这些算法,适合我们遇到的任何情况,不能够说那种算法是好的,不同的算法都有好坏,我们可以根据不同的情况,从这些算法中选择合适的算法。每一种排序都有最好的情况和最坏的情况。1.从平均时间性能而言,快速排序是最好的,因为其所用的时间是最少的。但是,如果想到最坏的情况,当然就要考虑到堆排序和归并排序。堆排序对n值较大时是比较有效的,因为堆排序主要的耗时是在建初始堆和调整建新堆时进行的反复的“筛选”。当n值很大时,归并排序所需时间较堆排序省,但是归并排序所需要的辅助空间较多。入过在输入一行数字是,这些数字是基本有序的,为了节省时间和空间,可以选择冒泡排序和简单选择排序。从方法的稳定性来说:基数排序时稳定的内部排序算法,所有时间复杂度为O(n2)的简单排序法也是稳定的,但是,快速排序、堆排序和希尔排序等时间较好的排序方法都是不稳定的。一般来说,排序过程中的“比较“是在“相邻两个关键字”间进行的排序方法是稳定的。因此,在所有的算法当中,没有哪一种算法是绝对最优的。有的适用于n较大时,有的适合n的有序情况,有

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1