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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

湘潭大学 数据结构实验7 实验报告 源代码 查找和排序算法.docx

1、湘潭大学 数据结构实验7 实验报告 源代码 查找和排序算法“数据结构和算法II”课程实验报告实验名称:查找和排序算法的实现 班级 姓名 学号 实验日期: 实验机时:2 学时 实验成绩:-一.实验目的: 掌握有序表、无序表查找的基本思想及存储、运算的实现 熟练掌握常用排序算法的基本思想及实现 深刻理解各种算法的特点,并加以灵活应用 加深对查找和排序的理解,逐步培养解决实际问题的编程能力 加深对图的理解,逐步培养解决实际问题的编程能力实验内容:(1)基本实验内容: 建立一个无序表并实现其上的顺序查找;建立一个有序表并实现其上的折半查找; 实现插入排序、起泡排序、快速排序和希尔排序的基本算法;(2)

2、 扩展实验内容: 建立二叉排序树并在其上查找指定关键字。二.程序及注释:1.顺序查找与二分法查找:#include#include#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef int status ;typedef int ElemType ;typedef structElemType *elem;int length,listsize;SqList;int n;status

3、 InitList(SqList &L)/初始化L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType);if(!L.elem) exit(OVERFLOW);L.listsize=LIST_INIT_SIZE;L.length=0;return OK;status Build(SqList &L)/建立表int i;printf(请输入元素个数n和n个元素n);scanf(%d,&n);if(nLIST_INIT_SIZE)/如果n大于当前空间L.elem=(ElemType *)realloc(L.elem,(n+LISTINCRE

4、MENT)*sizeof(ElemType);if(!L.elem) exit(OVERFLOW);L.listsize=n+LISTINCREMENT;for(i=0;in;i+)scanf(%d,L.elem+i);L.length=n;return OK;void Sort(SqList &L)/冒泡排序(升序)int i,j,t;for(i=1;iL.length;i+)for(j=0;j*(L.elem+j+1)t=*(L.elem+j);*(L.elem+j)=*(L.elem+j+1);*(L.elem+j+1)=t;void sunxv(SqList &L,int x)/顺序查

5、找函数 int i,k=0;for(i=0;in;i+) if(x=*(L.elem+i)printf(已找到您查找的元素:%dn,x);k=1;break; if(k=0)printf(未找到您查找的元素n);int erfen(SqList &L,int x)/二分法查找函数 int left,mid,right;left=0;right=n-1;while(left=right) mid=(left+right)/2;if(*(L.elem+mid)x)right=mid-1;elseprintf(已找到您查找的元素:%dn,x);return 0;printf(未找到您查找的元素n);

6、int main()int op,x,sign=1;SqList L,Lb;InitList(L);Build(L);Sort(L);while(sign) printf(请选择要执行的查找方式:n 【1】顺序查找n 【2】二分查找n 【0】退出n);scanf(%d,&op);if(op=0)sign=0;continue;printf(请选择要查找的元素:n);scanf(%d,&x);if(op=1)sunxv(L,x);else if(op=2)erfen(L,x);elseprintf(输入错误n);2.几种排序算法:#include#include#define Q 1000typ

7、edef struct char *base ; int stacksize ; int length;SqList1; void zj(FILE *fp)/插入排序SqList1 r; int i,j; char temp,*p; r.base=(char *) malloc(Q*sizeof(char); r.stacksize = Q; r.length = 0; while(!feof(fp) fscanf(fp,%c,r.base); r.base+; r.length+; if(r.length = r.stacksize ) r.base= r.base - r.length;

8、r.base=(char *) realloc(r.base,(r.stacksize + Q) * sizeof(char); if(!r.base) printf(ERROR); return ; r.base = r.base + r.stacksize; r.stacksize += Q; r.length -; r.base -; r.base= r.base - r.length; for (i = 1 ; i r.length ;+i ) for(j=0;j i;+j) if(r.basei j; -i ) r.basei = r.basei-1;/记录后移 r.basej =

9、temp;/插入到正确的为位置 r.baser.length =0; rewind(fp); fprintf(fp,%s,r.base); fclose(fp); free(r.base);typedef struct char *base ; int stacksize ; int length;SqList3; void xe(FILE *fp)/希尔排序SqList3 r; int i,j,k,m; char temp; r.length = 0; r.base=(char *) malloc(1000*sizeof(char); r.stacksize = 1000; while(!f

10、eof(fp) fscanf(fp,%c,r.base); r.base+; r.length+; if(r.length = r.stacksize ) r.base= r.base - r.length; r.base=(char *) realloc(r.base,(r.stacksize + Q) * sizeof(char); if(!r.base) printf(ERROR); return ; r.base = r.base + r.stacksize; r.stacksize += Q; r.length -; r.base -; r.base= r.base - r.leng

11、th; for(k = 0; k 10 ; k+) m = 10 - k; for( i = m ; i r.length; i + ) if(r.basei = 0 & temp r.basej; j -= m) r.base j + m = r.basej; /记录后移,查找插入位置 r.base j + m = temp;/插入 rewind(fp); fprintf(fp,%s,r.base); fclose(fp); free(r.base);typedef struct char *base ; int stacksize ; int length;SqList7; void mp

12、(FILE *fp)/冒泡排序 SqList7 r; int i,j ,m; char temp; r.length = 0; r.base = (char *) malloc(1000*sizeof(char); r.stacksize = 1000;while(!feof(fp) fscanf(fp,%c,r.base); r.base+; r.length+; if(r.length = r.stacksize ) r.base= r.base - r.length; r.base=(char *) realloc(r.base,(r.stacksize + Q) * sizeof(ch

13、ar); if(!r.base) printf(ERROR); return ; r.base = r.base + r.stacksize; r.stacksize += Q; r.length -; r.base -; r.base= r.base - r.length; for( i=0; i = i;j - ) /从后往前依次两两比较,较小的被调换到前面 ; if(r.basej+1 = 1 ; -i)/把r.base1.r.length建成大顶堆 HeapAdjust(r.base,i,r.length); for(i = r.length ;i = 2 ; -i) temp = r

14、.base1; r.base1 = r.basei; r.basei = temp; HeapAdjust(r.base,1,i-1);/将r.base1.i-1重新调整为大顶堆 k = (char *) malloc(r.length+1)*sizeof(char); for(i = r.length,j = 0; i = 1; i-,j+) kj = r.basei; kj=0; rewind(fp); fprintf(fp,%s,k); fclose(fp); free(k); free(r.base);void HeapAdjust(char *r,int k,int m) int i

15、,j; char x; i=k; x=ri; j=2*i;/沿key 较大的孩子节点向下筛选 while(j=m)/j为key较大的记录的下标 if( (jrj+1) ) j+; if(xrj)/插入字符比当前的大,交换 ri =rj; i = j; j *= 2; else /否则比较停止 j = m + 1; ri = x;/把字符x插入到该位置,元素插入实现#include#include#define Q 1000typedef struct char *base ; int stacksize ; int length;SqList6; void merge(SqList6 r,in

16、t h,int m,int w,SqList6 t)/对相邻两组数据进行组合排序; int i,j,k; i = h; j = m + 1; k = h - 1;/j为合并的第二组元素的第一个数位置,k为存入t中的数的位置 while(i = m)&(j = w)/依次排列两组数据 k+; if(r.basei m)/第一组数据先排完的情况 while(j = w) t.base+k=r.basej+; else while(i = m) t.base+k=r.basei+;void tgb(int s,int n,SqList6 r,SqList6 t)/对数据进行每组s个数的归并排序; i

17、nt i=1;/i为要合并两组元素的第一个数位置; while(i=(n-2*s+1) merge(r,i,i+s-1,i+2*s-1,t);/i+s-1为要合并的第一组元素的最后一个数位置、i+2*s-1 为要合并的两组元素最后一个数位置 i=i+2*s; if(i(n-s+1) /考虑n不能被s整除,如果余下的数少于2*s 但大于s,也就是余下的数不能凑成两组,凑一组有余,则把余下的数进行组合,并对其进行排序; merge(r,i,i+s-1,n,t); else /如果余下的数少于s,则余下的数进行组/合,并进行排序; while(i=n) t.basei=r.basei+;void g

18、b(FILE *fp)/归并主函数; SqList6 r; r.length = 0; r.base=(char *) malloc(1000*sizeof(char); r.stacksize = 1000; r.base += 1; while(!feof(fp) fscanf(fp,%c,r.base); r.base+; r.length+; if(r.length = (r.stacksize - 1) ) r.base= r.base - r.length - 1; r.base=(char *) realloc(r.base,(r.stacksize + Q) * sizeof(

19、char); if(!r.base) printf(ERROR); return ; r.base = r.base + r.stacksize; r.stacksize += Q; r.length -; r.base= r.base - r.length - 2; int i,j,n,s=1; n = r.length; SqList6 t; t.base=(char *) malloc(r.stacksize*sizeof(char);/给待排序的数组t申请内存; while(sn)/每组元素不断增加循环进行合并排序; tgb(s,n,r,t);/ s为每组元素的个数、n为元素总个数、r

20、为原数组,t为待排序的数组,进行归并排序;把元素个数相同的两组合并 并进行重新定义成新的一组,此组元素个数为2*s; s*=2; if(sn) tgb(s,n,t,r); s *= 2; /当元素个数小于n时,对其进行合并排序; else /当元素个数大于n时,对剩下的数排序; i=0; while(i=n) r.basei=t.basei+1; i+; r.baser.length =0; rewind(fp); fprintf(fp,%s,r.base); fclose(fp); free(t.base); free(r.base);int main() FILE *fp; int sig

21、n=1; while(sign != 0) printf(请选择:n); printf( %6c 1直接插入排序n, ); printf( %6c 2希尔排序n, ); printf( %6c 3堆排序n, ); printf( %6c 4归并排序n, ); printf( %6c 5冒泡排序n, ); printf( %6c 0退出n, ); printf(请输入:); scanf(%d,&sign); if(fp=fopen(xuexinsheng.txt,r+)=NULL) printf( File open error!n); return 0; switch(sign) case 1

22、: zj(fp);break; case 2: xe(fp); break; case 3: dp(fp);break; case 4: gb(fp); break; case 5: mp(fp);break; case 0: break; if(sign!=0) printf(排序已完成nn); 三.运行结果:1.顺序查找与二分法查找:2.几种排序算法:(排序算法运行结果如上,由于几种排序方法的运行结果相同,故只演示其中一种的截图。)四.实验心得: 通过本次课程设计,我们小组的每个成员都学到了很多东西。首先要说的是我们的编程能力,在这一次的课程设计中我们的编程能力均得到了一定程度的提升。并且通过这次课程设计,我们更加熟悉了如何使用Header File文件。本次课程设计,让我们对于直接插入排序,希尔排序,堆排序,归并排序,冒泡排序等五种排序算法的思想有了进一步的认识,同时对五种算法的应用有了更进一步的掌握。通过这次课程设计,我们对于解决实际问题的能力有了进一步提高。最重要的是,这次课程设计大大的训练了我们的小组团队协作能力。通过这次课程设计我们小组各成员的团队协作能力都有了很大的提升。这种团队协作能力对于我们学编程的来说是极其重要的,同时也是必不可少的。

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

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