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