淮海工学院linux实验二文件IO操作,淮海工学院计算机科学系

《淮海工学院计算机科学系》由会员分享,可在线阅读,更多相关《淮海工学院计算机科学系(15页珍藏版)》请在技术文库上搜索。

1、淮海工学院计算机科学系实验报告书课 程名: 数据结构 题 目: 实验五 查找、排序的应用实验 班 级: 网络061 学 号: 110612114 姓 名: 陆志钦 评语:成绩: 指导教师: 批阅时间: 年 月 日数据结构实验报告 - 14 -1实验内容或题目实验题目:查找、排序的综合实验实验内容:1)取N(N=1000)个数据,在各种排序方法中选择35种对这N个数据进行排序,并对你所用的排序方法进行时间复杂度的分析; 2)对上面已排序的N个数据进行查找,至少用两种查找算法实现(其中静态查找至多选一种),并计算出所用查找算法的ASL 。 2目的与要求实验目的: 1)通过实验能够掌握排序的各种方法。

2、,并能够分析各种排序方法的效率; 2)通过实验能够掌握查找的若干算法,并能够计算各种查找方法的ASL; 3)通过实验能够综合运用所学知识,并应用于实际,灵活地解决实际问题。实验要求:3实验步骤1) 资料搜集与分析查找表:是由同一类型的数据元素(或记录)构成的集合。查找表的操作:1、查询某个“特定的”数据元素是否在查找表中。2、检索某个“特定的”数据元素的各种属性。3、在查找表中插入一个数据元素;4、从查找表中刪去某个数据元素。静态查找表对查找表只作前两种操作动态查找表在查找过程中查找表元素集合动态改变关键字是数据元素(或记录)中某个数据项的值主关键字可以唯一的地标识一个记录次关键字用以识别若干。

3、记录查找根据给定的某个值,在查找表中确定一个其关键字等于给定的记录或数据元素。若表中存在这样的一个记录,则称查找是成功的,此时查找的结果为给出整个记录的信息,或指示该记录在查找表中的位置;若表中不存在关键字等于给定值的记录,则称查找不成功。平均查找长度:为确定记录在查找表中的位置,需用和给定值进行比较的关键字个数的期望值称为查找算法在查找成功时的平均查找长度。其中:Pi为查找表中第i个记录的概率,且;Ci为找到表中其关键字与给定值相等的第i个记录时,和给定值已进行过比较的关键字个数。等概率条件下有:假设查找成功与不成功的概率相同:http:/www.ygblog.com/user1/3020/。

4、archives/2006/10155.htmlhttp:/dev.21tx.com/2005/05/11/13424.html2) 需求分析有关排序和查找的一个主要问题就是速度。这个问题经常被人们忽视,因为与程序的其余部分相比,排序或查找所花费的时间几乎可以被忽略。然而,对大多数排序或查找应用来说,你不必一开始就花很多精力去编制一段算法程序,而应该先在现成的算法中选用一种最简单的(见31和34),当你发现所用的算法使程序运行很慢时,再换用一种更好的算法(请参见下文中的介绍)。下面介绍一种判断排序或查找算法的速度的方法。首先,引入一个算法的复杂度的概念,它指的是在各种情况(最好的、最差的和平均。

5、的)下排序或查找需要完成的操作次数,通过它可以比较不同算法的性能。算法的复杂度与排序或查找所针对的数据集的数据量有关,因此,引入一个基于数据集数据量的表达式来表示算法的复杂度。最快的算法的复杂度O(1),它表示算法的操作次数与数据量无关。复杂度O(N)(N表示数据集的数据量)表示算法的操作次数与数据量直接相关。复杂度O(logN)介于上述两者之间,它表示算法的操作次数与数据量的对数有关。复杂度为O(NlogN)(N乘以logN)的算法比复杂度为O(N)的算法要慢,而复杂度为O(N2)的算法更慢。a) 注意:如果两种算法的复杂度都是O(logN),那么logN的基数较大的算法的速度要快些,在本章。

6、的例子中,logN的基数均为10。 3) 数据结构与算法设计直接插入排序:void Straight_insert_sort(r,n) /*直接插入*/ for(i=2; i=0) & (r0.keyrj+1.key) b3+;rec.key=rj.key;rj.key=rj+1.key;rj+1.key=rec.key;a3=a3+3;flag=1;快速排序:void Quick_sort(r,l,h) /* 快 速 排 序 */ While(i1)top=push(ss,top,k+1,high);high=k-1;if(top0)top=pop(ss,top,&j,&i);简单选择排序:。

7、void Simple_select_sort(r,n) /* 简 单 选 择 排 序 */for (i=1;i#define s 1000typedef struct recordint key;static struct record a1s,a2s,a3s,a4s,a5s,a6s,rec;int a7,b7;void Straight_insert_sort(r,n) /*直接插入*/struct record r;int n; int i,j;a1=0;b1=0;for(i=1;i=0) & (r0.key=1) h=t;for(j=h;j=0) & (ri.keyrec.key) b。

8、3+;temp=ri+h;ri+h=ri;ri=temp;i=i-h;a2=a2+3;t=t/2;b2+;void Bubblle_sort(r,n) /* 冒 泡 排 序 */struct record r;int n; struct record rec;int i,j,m,flag;a3=0;b3=0;for(i=1;irj+1.key) b3+;rec.key=rj.key;rj.key=rj+1.key;rj+1.key=rec.key;a3=a3+3;flag=1;int push(h,top,m,n)int h;int top ,m,n; h+top=m;h+top=n;retu。

9、rn(top);int pop(h,top,m,n)int h, top,*m,*n; *m=htop-;*n=htop-;return(top);int quick(r,i,j)struct record r;int i,j;rec=ri;while(irec.key)j-;b4+;if(i1)top=push(ss,top,k+1,j);j=k-1;if(top0)top=pop(ss,top,&j,&i);void Simple_select_sort(r,n) /* 简 单 选 择 排 序 */struct record r;int n;int i,j,m;a5=0;b5=0;for(。

10、i=1;idata) p=T;return 1; /查找成功else if(keydata) tmp1=SearchBST(T-lchild,key,T,p); /在左子树中继续查找else tmp2=SearchBST(T-rchild,key,T,p); /在右子树中继续查找if(tmp1|tmp2) return 1; /若在子树中查找成功,向上级返回Trueelse return 0; /否则返回Falseint InsertBST(BiTree &T,int e)/当二叉排序树T中不存在元素e时,插入e并返回True,否则返回FalseBiTree p,s;if(!SearchBST。

11、(T,e,NULL,p) /查找不成功s=(BiTree)malloc(sizeof(BiTNode);s-data=e;s-lchild=s-rchild=NULL;if(!p) T=s; /被插结点*s为新的根结点else if(edata) p-lchild=s; /被插结点*s为左孩子else p-rchild=s; /被插结点*s为右孩子return 1; /成功插入else return 0; /树中已存在关键字为e的数据元素main()char ch;int i,j,t,k;printf(作者网络 陆志钦n);int keyword,temp;BiTree T=NULL,p;in。

12、t e=0;srand(time(0); /初始化随机种子printf(随即产生个数进行操作:n);for(int i=0;iO(log2n) O(n);其它排序方法归为一类,其空间复杂性为O(1)。2. 稳定性所有排序方法可分为两类,一类是稳定的,包括直接插入排序、起泡排序、简单选择排序和归并排序;另一类是不稳定的,包括希尔排序、快速排序和堆排序。3. 算法简单性从算法简单性看,一类是简单算法,包括直接插入排序、简单选择排序和起泡排序;另一类是改进算法,包括希尔排序、堆排序、快速排序和归并排序,这些算法都很复杂。4. 待排序的记录个数n的大小从待排序的记录个数n的大小看,n越小,采用简单排序。

13、方法越合适。5. 记录本身信息量的大小表8-2三种简单排序算法中记录的移动次数的比较记录本身信息量越大,移动记录所花费的时间就越多,所以对记录的移动次数较多的算法不利。 排序方法最好情况最坏情况平均情况直接插入排序O(n)O(n2)O(n2)起泡排序0O(n2)O(n2)简单选择排序0O(n)O(n)6. 关键码的分布情况当待排序记录序列为正序时,直接插入排序和起泡排序能达到O(n)的时间复杂度;对于快速排序而言,这是最坏的情况,此时的时间性能蜕化为O(n2);简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键码的分布而改变。4测试数据与实验结果5用户手册按照界面上的提示进行一系列操作。

14、.6实验体会这次实验让我们将之前的查找与排序进行了融合。并且让我学会了使用一个新的函数rand(),排序一般分为直接插入排序,希尔排序,冒泡排序,快速排序,简单选择排序,堆排序六中排序。而且了解了空间复杂性,稳定性,算法简单性。排序就是把一组记录按照某个关键字的值进行一个新的排列的过程。按不同的关键字进行排序,多得到的结果也是不同的。而且内部排序与外部排序也有本质的区别。动态查找与静态查找的区别以及应用,查找则是在排序完成以后进行特定的查找,查找一个特特定数字,并且将查找的结果体现出来。一般静态为书讯查找顺序表的查找静态查找表的顺序存储结构typedef struct ElemType *el。

15、em;int length;SSTable;顺序查找:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,查找不成功。int Search_Seq(SSTable ST,KeyType key)ST.elme0.key=key;for(i=ST.length; !EQ(ST.elemi.key,key); -i);return i;动态查找:二叉排序树及其查找过程二叉排序树或者是一棵空树;或者是具有下列性质的二叉树:、若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;、若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;、它的左、右子树了分别为二叉排序树。如果取二叉链表作为二叉排序树的存储结构,则上述查找过程如下:BiTree SearchBST(BiTree T,KeyType key)if(!T)|EQ(key,T-data.key) return (T);else if LT(key,T-data.key) return (SearchBST(T-lchild,key);else return (SearchBST(T-rchild.key);/SearchBST通过这次实验同样让我进行了一次复习,在以后的学习中能够更加努力。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值