查找排序的应用.docx
- 文档编号:9242910
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:18
- 大小:118.11KB
查找排序的应用.docx
《查找排序的应用.docx》由会员分享,可在线阅读,更多相关《查找排序的应用.docx(18页珍藏版)》请在冰豆网上搜索。
查找排序的应用
淮海工学院计算机工程学院
实验报告书
课程名:
《数据结构》
题目:
实验4查找、排序的应用
班级:
学号:
姓名:
实验4查找、排序的应用
实验目的和要求
1.熟悉查找表的存储结构。
2.熟练掌握循序查找和二分查找方法。
3.熟悉几种典型的排序方法,并对各种算法的特点、使用范围和效率有进一步的了解。
4.实现两种以上的简单排序和快速排序、比较它们的时间效率。
5.要求独立完成实验内容(提交程序清单、相关实验数据及运行结果);
6.要求认真书写实验报告,并按时提交。
实验环境
TurboC或VC++
实验学时
4学时,必做实验
实验内容和步骤
l、产生n个整数并存于数组r[1..n]中。
对主要查找算法(顺序查找、折半查找)和排序算法(直接插入排序、冒泡排序、快速排序、简单选择排序)进行实验比较,计算出平均比较次数、平均移动次数。
2、对实验结果数据进行对比分析。
源程序:
查找:
1)顺序查找:
#include
#defineN23
ints=0;
typedefstruct
{
intkey;
}RecordType;
intSeqsearch(RecordTyper[],intk)
{
inti=N-1;
while(++s&&r[i].key!
=k)
i--;
returni;
}
main()
{
inti,x,j;
RecordTyper[N];
scanf("%d",&x);//
freopen("in.txt","r",stdin);
for(i=1;i scanf("%d",&r[i].key); for(i=1;i printf("%d",r[i].key); printf("\n"); j=Seqsearch(r,x); if(j>0) { printf("查找的数在第%d个\n",j); printf("平均查找次数为%f: \n",s*1.0/(N-1)); } else printf("查找的数不在列表中\n"); } 2)折半查找: #include #defineN23//元素个数 ints=0; intn=0; typedefstruct { intkey; }RecordType; intBinsrch(RecordTyper[],intlow,inthigh,intk) { intmid; while(low<=high) { mid=(low+high)/2; if(++s&&k==r[mid].key) returnmid; elseif(++s&&k high=mid-1; else low=mid+1; } return(0); } voidSelectSort(RecordTyper[]) { RecordTypex; intk,i,j; for(i=1;i { k=i; for(j=i+1;j<=N-1;j++) if(r[j].key k=j; if(k! =i) { x=r[i];n++; r[i]=r[k];n++; r[k]=x;n++; } } } main() { inti,x,j; RecordTyper[N]; scanf("%d",&x); freopen("in.txt","r",stdin); for(i=1;i scanf("%d",&r[i].key); for(i=1;i printf("%d",r[i].key); printf("\n"); SelectSort(r); for(i=1;i printf("%d",r[i].key); j=Binsrch(r,1,N-1,x); if(j>0) { printf("查找的数在第%d个\n",j); printf("平均查找次数为%f: \n",s*1.0/(N-1)); printf("平均移动次数为%f: \n",n*1.0/(N-1)); } else printf("查找的数不在列表中\n"); } 排序: 1)直接插入排序: #include #defineN23//元素个数 ints=0;//记录比较次数 intn=0; typedefstruct { intkey; }RecordType; voidInSort(RecordTyper[],intlength) { inti,j; for(i=2;i { r[0]=r[i]; n++; j=i-1; while(++s&&r[0].key { r[j+1]=r[j]; n++; j=j-1; } r[j+1]=r[0]; n++; } } main() { inti; RecordTyper[N]; freopen("in.txt","r",stdin); for(i=1;i scanf("%d",&r[i].key); printf("排序前顺序: \n"); for(i=1;i printf("%d",r[i].key); printf("\n"); InSort(r,N); printf("排序后顺序: \n"); for(i=1;i printf("%d",r[i].key); printf("\n"); printf("平均比较次数为: %f\n",s*1.0/(N-1)); printf("平均移动次数为: %f\n",n*1.0/(N-1));; return; } 2)冒泡排序: #include #defineN23//元素个数 ints=0;//记录比较次数 intn=0;//记录移动次数 typedefstruct { intkey; }RecordType; voidBubbleSort(RecordTyper[]) { RecordTypex; inti,j,change; change=1; for(i=1;i { change=0; for(j=1;j if(++s&&r[j].key>r[j+1].key) { x=r[j];n++; r[j]=r[j+1];n++; r[j+1]=x;n++; change=1; } } } voidmain() { inti; RecordTyper[N]; freopen("in.txt","r",stdin); for(i=1;i scanf("%d",&r[i].key); printf("排序前顺序: \n"); for(i=1;i printf("%d",r[i].key); printf("\n"); BubbleSort(r); printf("排序后顺序: \n"); for(i=1;i printf("%d",r[i].key); printf("\n"); printf("平均比较次数为: %f\n",s*1.0/(N-1)); printf("平均移动次数为: %f\n",n*1.0/(N-1)); } 3)快速排序: //s的位置? #include #include #defineN23//元素个数 ints=0;//记录比较次数 intn=0;//记录移动次数 typedefstruct { intkey; }RecordType; QKSass(RecordTyper[],intlow,inthigh) {RecordTypex; x=r[low];n++; while(low { while(++s&&low high--; if(low { n++; r[low]=r[high]; low++; } while(++s&&low low++; if(low { n++; r[high]=r[low]; high--; } } r[low]=x;n++; returnlow; } voidQKSort(RecordTyper[],intlow,inthigh) { intpos; if(low { pos=QKSass(r,low,high); QKSort(r,low,pos-1); QKSort(r,pos+1,high); } } voidmain() { inti; RecordTyper[N]; freopen("in.txt","r",stdin); for(i=1;i scanf("%d",&r[i].key); printf("排序前顺序: \n"); for(i=1;i printf("%d",r[i].key); printf("\n"); QKSort(r,1,N-1); printf("排序后顺序: \n"); for(i=1;i printf("%d",r[i].key); printf("\n"); printf("平均比较次数为: %f\n",s*1.0/(N-1)); printf("平均移动次数为: %f\n",n*1.0/(N-1)); } 4)简单选择排序: #include #defineN23//元素个数 ints=0;//记录比较次数 intn=0;//记录移动次数 typedefstruct { intkey; }RecordType; voidSelectSort(RecordTyper[]) { RecordTypex; intk,i,j; for(i=1;i { k=i; for(j=i+1;j<=N-1;j++) if(r[j].key k=j; if(k! =i) { x=r[i];n++; r[i]=r[k];n++; r[k]=x;n++; } } } voidmain() { inti; RecordTyper[N]; freopen("in.txt","r",stdin); for(i=1;i scanf("%d",&r[i].key); printf("排序前顺序: \n"); for(i=1;i printf("%d",r[i].key); printf("\n"); SelectSort(r); printf("排序后顺序: \n"); for(i=1;i printf("%d",r[i].key); printf("\n"); printf("平均比较次数为: %f\n",s*1.0/(N-1)); printf("平均移动次数为: %f\n",n*1.0/(N-1)); } 5)折半插入排序: #include #defineN23//元素个数 ints=0;//记录比较次数 intn=0;//记录移动次数 typedefstruct { intkey; }RecordType; voidBinSort(RecordTyper[],inty) { RecordTypex; inti,low,high,mid,j; for(i=2;i<=y;++i) { x=r[i];n++; low=1; high=i-1; while(low<=high) { mid=(low+high)/2; if(++s&&x.key elselow=mid+1; } for(j=i-1;j>=low;--j) { r[j+1]=r[j];n++; } r[low]=x;n++; } } voidmain() { inti; RecordTyper[N]; freopen("in.txt","r",stdin); for(i=1;i scanf("%d",&r[i].key); printf("排序前顺序: \n"); for(i=1;i printf("%d",r[i].key); printf("\n"); BinSort(r,N-1); printf("排序后顺序: \n"); for(i=1;i printf("%d",r[i].key); printf("\n"); printf("平均比较次数为: %f\n",s*1.0/(N-1)); printf("平均移动次数为: %f\n",n*1.0/(N-1)); } 实验结果: 1、顺序查找: 2、折半查找: 排序: 1)直接插入排序: 2)冒泡排序: 3)快速排序: 4)简单选择排序: 5)折半插入排序: 实验体会: 1、在调用各个程序时一定要注意形参和实参的对应。 2、最好每次成对输入各括号,然后再向里面添加内容,避免漏写的情况提高效率。 (在调试程序时,不一定会查出具位置,会浪费很多精力) 3、在统计比较次数时我用“S”的自增来表示,在写程序时,要写成“++S”因为如果是“S++”,如果它第一次就出现在“&&”语句中会导至结果出错,而且“++S”要写在最前面,因为如果条件不符合会直接跳出,而“++S”还未执行,这样比较就漏记了一次。 4、对于查找来说,不能单从个例的平均比较次来看算法的效率,看具体情况,比如顺序查找适合无序的少的数据,而折半适合有序大量的数据。 5、从排序的实验结果可能看出在列举的几种算法中,对于这个列子来说: 简单选择排序最稳定,效率最高;快速排序次之;折半插入再次;然后是直接插入;最后是冒泡。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 查找 排序 应用