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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构实验报告.docx

1、数据结构实验报告学生学号0120903490318学 生 实 验 报 告 书实验课程名称应用数据结构开 课 学 院管理学院指导教师姓名燕翔学 生 姓 名谢力学生专业班级信管0903班2011 2012 学年 第 1 学期实验项目名称综合算法设计同 组 者无实验日期2011年 11 月 24日第一部分:实验预习报告1、 实验目的、意义1) 掌握查找的含义2) 掌握基本查找操作的算法和实现3) 掌握动态查找算法的实现、应用场合与优缺点4) 能够针对具体问题,灵活选用适宜的查找算法5) 掌握排序的基本概念,对排序的稳定性及排序的时间复杂度有深刻的认识6) 对比折半插入排序和Shell排序的异同7)

2、掌握选择排序中堆排序的基本思想和算法实现8) 掌握快速排序的基本思想和算法实现9) 了解归并排序算法的基本思想和程序实现10) 了解基数排序算法的基本思想和程序实现11) 掌握Hash排序算法的基本思想和程序实现12) 在上述内容的基础上,将所有查找及排序算法整合在一个程序中2、 实验基本原理与方法本实验涉及各类查找和排序算法。静态查找,折半查找的思想为:设查找表中的元素存放在数组r中,数据元素的下标范围为low, high,要查找的关键字值为key,中间元素的下标为mid=|_(low + high) /2_|(向下取整),令key与rmid的关键字比较:1 若key=rmid.key,查找

3、成功,下标为m的记录即为所求,返回mid。2 若keyrmid.key,所要找的记录只能在右半部分记录中,再对右半部分使用折半查找法继续进行查找,搜索区间缩小了一半。重复上述过程,直到找到查找表中某一个数据元素的关键字的值等于给定的值key,说明查找成功;或者出现low的值大于high的情况,说明查找不成功。动态查找,编程实现一个开放式的高校本科招生最低录取分数线的查询系统,供师生和家长等查询,高校自愿放入该校的信息,可能随时有高校加入。要求实现的查询功能有:查询等于用户给定分数的高校;查询大于(或小于)用户给定分数的高校查询最低录取分数线在用户给定的分数段中的高校。直接插入排序:将当前无序区

4、的第一个记录插入到有序区中适当位置。折半查找法:在有序表中进行,先确定表的中点位置,再通过比较确定下一步查找哪个半区。Shell排序:先取定一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组,所有距离为d1倍数的记录放在同一个组中,在各组内进行直接插入排序;然后取第二个增量重复上述分组和排序,直至所取的增量dt=1(dtdt-1d2d1),即所有记录放在同一组中进行直接插入排序为止。堆排序是利用大顶堆(或小顶堆)来选取当前无序区中关键字最大(或最小)的记录实现排序快速排序是对冒泡法的改进,其基本思想是:通过一趟排序将待排文件分割成独立的两部分,其中一部分记录的关键字值均比另一部分

5、记录的关键字小,然后分别对这两部分进行排序,以达到整个序列有序。归并的思想:将两个或两个以上的有序表合并成一个有序表。利用归并的思想实现排序,假设初始的序列含有n个记录,可以看成n个有序的子序列,每个子序列的长度为m,然后把i(2)个子序列归并,得到n/i个长度为i的子序列;再继续归并,如此重复直到得到一个长度为n的有序序列为止。通常使用的是i=2的二路归并法。基数排序的基本思想是采用多关键字的排序。设记录关键字Ri由d个分量ki1, ki2, , kid组成,设每个分量的取值范围为ti|i=1, 2, , m,且t1t2tm。准备m个箱子,先按低位分箱再按序号一次将各个非空箱子里的记录收集起

6、来,再对新收集起来的元素依次按较高的位分箱,直到最高位。分箱即将第s个关键字等于ti的全部记录装入第i个箱子里。按最高位分箱后,按序号一次将各个非空箱子里的记录收集起来,得到的元素序列就是有序的。Hash排序是在Hash查找的基础上演变而来。对待排序列采用单调的Hash函数,并用链地址法处理冲突,最后用一定规则收集存储好的数据从而得到有序序列。3、 主要仪器设备及耗材安装有Turbo C+ 3.0运行环境的电脑,无耗材要求。4、 实验方案或技术路线本实验含有五部分内容静态查找、动态查找、插入排序与选择排序、快速排序与归并排序、查找及排序算法集成。A静态查找部分查找表的存储结构为有序表,即表中记

7、录按关键字大小排序存放。输入待查数据元素的关键字进行查找。为了简化算法,记录只含一个整型量关键字字段,记录的其余数据部分忽略不考虑。此程序中要求对整型量关键字数据的输入按从小到大排序输入。B动态查找部分主要的功能是查找,查找表为高校最低录取分数信息的集合。根据题意可知,该查找表中的元素个数可能随时增减,所以它是一个动态查找表,可采用树状结构保存。为了提高查询速度,可建立二叉排序树并在二叉排序树中实现查找。C排序部分考虑对20个整数的随机输入进行排序,各排序功能基本上都可以成为独立调用的模块,因此可以先写出排序算法,然后用主函数调用。D 查找及排序算法集成部分此部分需要学生自行设计,本指导书不给

8、出具体算法。第二部分:实验过程记录实验原始记录(包括实验数据记录,实验现象记录,实验过程发现的问题等)1 概要设计(说明本程序中用到的所有抽象数据类型的定义,主程序的流程以及 各程序模块之间的层次或调用关系)1.1抽象数据类型: 队列:ADT Queue 数据对象:D ai | aiElemSet, i=1,2,.,n, n0 数据关系:R1 |ai-1, aiD, i=2,.,n 基本操作:void init_Q(Queue &Q);操作结果:构造空队列Qint Q_empty(Queue Q);初始条件:队列Q存在操作结果:若Q为空队列,则返回TRUE,否则FALSEint Q_lengt

9、h(Queue Q);初始条件:队列Q存在操作结果:返回队列Q的元素个数,即队列长度int gethead_Q(Queue Q);初始条件:队列Q存在操作结果:返回队列Q的队头元素void en_Q(Queue &Q,int e);初始条件:队列Q存在操作结果:插入元素e为Q的新的队尾元素。void de_Q(Queue &Q,int &e);初始条件:队列Q存在操作结果:删除Q的队头元素。ADT Queue线性表: ADT List数据对象: D=ai|1=i=o,ai属于elementtype类型数据关系:R=|ai,ai+1属于D,i=1,.,n-1基本运算:InitList(&l)De

10、stroyList(&l);.图:ADT Graph 数据对象: D=ai|1=i=0,ai属于ELEMTYPE类型 类型标识符数据关系: R=|ai,aj属于D,1=i=n,1=j=n,其中每个元素可以有零个或多个直接前驱,可以有多个直接后继基本运算: InitGraph(&g) ClearGraph(&g)DFS(g)BFS(g).1.2小问题:A .随机数的产生: srand()函数用于设置随机数种,rand()用于产生一个随机数。B.数据的储存: 由于100000个int型数的数组,所以我采用了malloc()函数来动态分配一数组存储它。 对于一些特别大的数据可以用文件存储,在采用外排

11、序的方式排序。 C.屏幕上无法显示100000条数据,故将数据存储在两个文本文件中。一个是没排好序的,另一个是排好序后的数据。1.3主要数据结构设计:归并排序:typedef int KeyType;typedef int DataType;typedef struct KeyType key; /* 排序码字段 */ /*DataType info; 记录的其它字段 */ RecordNode;typedef struct int n; /* n为文件中的记录个数,nMAXNUM */ RecordNode recordMAXNUM; SortObject;基数排序:typedef int

12、KeyType;typedef int DataType;typedef struct Node RadixNode;struct Node KeyType keyD; /* DataType info;*/ RadixNode *next;typedef RadixNode *RadixList;typedef struct QueueNode RadixNode *f; /* 队列的头指针 */ RadixNode *e; /* 队列的尾指针 */Queue;Hash排序:typedef struct hnode int data; struct hnode *next;HNODE;typ

13、edef struct point struct hnode *pt;POINT;1.4主程序流程:主程序main()输入随机数种子产生随机数,并存在nonqueue.txt文件中选择排序方法5.归并4.快速3.堆2.希尔1.折半选择排序方法,并存在queue.txt文件中退出程序主函数在main.c中,排序算法的在各自的源文件中。选择排序方法后,调用选择的排序方法。1.4 各函数调用关系:rand()BinsertSort()ShellInsert()fopen()srand()ShellSort()main()RadixSort()HeapSort()mergeSort()QuickSor

14、t()fclose()Partition()2详细设计(实现程序模块的具体算法)2.1主函数:void main() int *p,n,way,dlta4=5,3,2,1,L=11; long i; FILE *fp,*fp1; if(!(fp=fopen(tan.txt,w+) printf(can not open the file tan.txt !); if(!(fp1=fopen(shi.txt,w+) printf(can not open the file shi.txt !); printf(input the rand seed:n); scanf(%d,&n); p=(in

15、t *)malloc(MAX*sizeof(int); for(i=1;iMAX;i+) pi=rand(); fprintf(fp1,%-8d,pi); fclose(fp1); printf(please input the way to sort:n1 for 折半插入排序,n2 for shellsort,n3 for堆排序算法,n4 for 快速排序算法,n5 for 归并排序.n: ); scanf(%d,&way); switch(way) case 1:BinsertSort(p, MAX-1);break; case 2:ShellSort(p,MAX-1,dlta,4);b

16、reak; case 3:HeapSort(p,MAX-1);break; case 4: QuickSort(p,MAX-1);break; case 5: vector.n = MAX-1; for(i=0;iMAX-1;i+) vector.record i.key =pi+1; mergeSort(&vector); for(i=0;iMAX-1;i+) fprintf(fp,%-8d,vector.record i.key ); fclose(fp); exit(1);case 6: for(i=0;iMAX-1;i+) elementi.key0=0; elementi.key1=

17、pi+1/10000%10; elementi.key2=pi+1/1000%10; elementi.key3=pi+1/100%10; elementi.key4=pi+1/10%10; elementi.key5=pi+1%10; elementi.next=NULL; hp=element; for (i=0; inext; while (hp) fprintf(fp,%-8d , hp-key1*10000+hp-key2*1000+hp-key3*100+ hp-key4*10+hp-key5); hp=hp-next; fclose(fp); exit(1); for(i=1;i

18、MAX;i+) fprintf(fp,%-8d,pi); fclose(fp);2.2各排序算法:归并排序:#define MAX 100001#define MAXNUM 100001#define TRUE 1#define FALSE 0typedef int KeyType;typedef int DataType;typedef struct KeyType key; /* 排序码字段 */ /*DataType info; 记录的其它字段 */ RecordNode;typedef struct long n; /* n为文件中的记录个数,nMAXNUM */ RecordNode

19、 recordMAXNUM; SortObject; void merge(RecordNode r, RecordNode r1, long low, long m, long high) long i=low, j=m+1, k=low; while ( i=m &j=high ) /* 反复复制两个段的第一个记录中较小的 */ if (ri.key=rj.key) r1k+=ri+; else r1k+=rj+; while (i=m) r1k+=ri+; /* 复制第一个段的剩余记录 */ while (j=high) r1k+=rj+;/* 复制第二个段的剩余记录 */* 对 r 做

20、一趟归并,结果放到 r1 中 */void mergePass(RecordNode r, RecordNode r1, long n, long length) long i=0, j; /* length为本趟归并的有序子段的长度 */ while (i+2*length-1n) merge(r,r1,i,i+length-1,i+2*length-1); /*归并长length的两个子段*/ i+=2*length; if(i+length-1n-1) /* 剩下两段,后一段长度小于length */ merge(r, r1, i, i+length-1, n-1); else for(

21、j=i; jn; j+) r1j=rj; /* 将剩下的一段复制到数组r1 */void mergeSort(SortObject * pvector) RecordNode recordMAXNUM; long length = 1; while (lengthn) /*一趟归并,结果存放在数组record中*/ mergePass(pvector-record, record, pvector-n, length); length*=2; /* 一趟归并,结果存回 */ mergePass(record, pvector-record, pvector-n, length); length

22、 *= 2; SortObject vector ;折半插入排序:void BinsertSort(int D, long L) long i, j, l, r, m; for (i=2; i=L; i+) D0=Di; l=1; r=i-1; while (l=r) m=(l+r)/2; if(D0=r+1; j-) Dj+1=Dj; Dr+1=D0; Shell排序:void ShellInsert(int D, long L, long dk) long i, j; for (i=dk+1; i=L; i+=dk) if ( Di0 & D0Dj; j=j-dk) Dj+dk=Dj; D

23、j+dk=D0; void ShellSort (int D, long L, int dlta, long t) long k; for (k=0; kt; k+) ShellInsert(D, L, dltak);堆排序算法:void HeapAdjust(int D, long s, long m) long j; D0=Ds; for (j=2*s; j=m; j*=2) if (jm & Dj=Dj) break; /* 已经符合堆定义,无须浪费时间 */ Ds=Dj; s=j; /* 交换,并使s指向新堆 */ Ds=D0; /* 找到合适的地点就将原堆顶元装进去 */void H

24、eapSort(int D, long L) long i; for (i=L/2; i0; i-) HeapAdjust(D, i, L); /* 将原始序列调整为堆 */ for (i=L; i1; i-) D0=D1; D1=Di; Di=D0; HeapAdjust(D, 1, i-1); 快速排序算法:int Partition(int D, long l, long r) D0=Dl; while (lr) while (lr & D0Dr) r-; Dl=Dr; while (l=Dl) l+; Dr=Dl; Dr=D0; return r;void Qsort(int D, l

25、ong l, long r) long p; if (lnext; for(j=d-1; j=0; j-) /* 进行d次分配和收集*/ p=head; for(i=0; ikeyj; /* 按排序码的第j个分量进行分配*/ if (!queuek.f) queuek.f=p; /* 若第k个队列空,当前记录为队首*/ else (queuek.e)-next=p; /* 否则当前记录链接到第k队的队尾*/ queuek.e=p; p=p-next; for(i=0; queuei.f=NULL; i+) ; /* 找出第一个非空队列*/ p=queuei.e; head=queuei.f; /* head为收集链表的头指针*/ for(i+; inext=queuei.f; /* 收集非空队列 */ p=queuei.e; p-next=NULL; (*plist)-next=head; 3调试分析(内容包括:a)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;b)算法的时空分析包括基

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

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