实验4 查找排序的应用.docx
- 文档编号:3888887
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:12
- 大小:131.29KB
实验4 查找排序的应用.docx
《实验4 查找排序的应用.docx》由会员分享,可在线阅读,更多相关《实验4 查找排序的应用.docx(12页珍藏版)》请在冰豆网上搜索。
实验4查找排序的应用
淮海工学院计算机工程学院
实验报告书
课程名:
《数据结构》
题目:
实验4查找、排序的应用
班级:
学号:
姓名:
实验4查找、排序的应用
实验目的和要求
1.熟悉查找表的存储结构。
2.熟练掌握循序查找和二分查找方法。
3.熟悉几种典型的排序方法,并对各种算法的特点、使用范围和效率有进一步的了解。
4.实现两种以上的简单排序和快速排序、比较它们的时间效率。
5.要求独立完成实验内容(提交程序清单、相关实验数据及运行结果);
6.要求认真书写实验报告,并按时提交。
实验环境
TurboC或VC++
实验学时
4学时,必做实验
实验内容和步骤
l、产生n个整数并存于数组r[1..n]中。
对主要查找算法(顺序查找、折半查找)和排序算法(直接插入排序、冒泡排序、快速排序、简单选择排序)进行实验比较,计算出平均比较次数、平均移动次数。
2、对实验结果数据进行对比分析。
1.#include
usingnamespacestd;
intcount;
intSepSearch(intr[],intkey,intlen)//顺序查找
{
inti;
count=0;
i=len;
while(key!
=r[i])
{
i--;
count++;
}
return(i);
}
intBinSrch(intr[],intkey,intlen)//折半查找
{
intlow,high,mid;
low=1;high=len;
count=0;
while(low<=high)
{count++;
mid=(low+high)/2;
if(key==r[mid])return(mid);
elseif(key elselow=mid+1; } return(0); } voidBiInsertsort(intr[],intn)//插入排序(折半) { count=0; for(inti=2;i<=n;i++) { if(r[i] { r[0]=r[i]; intlow=1,high=i-1; while(low<=high) { count++; intmid=(low+high)/2; if(r[0] high=mid-1; elselow=mid+1; } intj; for(j=i-1;j>high;j--) { r[j+1]=r[j]; count++; } r[j+1]=r[0]; } } for(intk=1;k<=n;k++) printf("%d",r[k]); printf("\n"); } voidBubbleSort(intr[],intn)//冒泡排序 { count=0; inti; inttemp,exchange,bound; exchange=n; while(exchange)//仅当上一趟排序有记录交换才进行本趟排序 { bound=exchange; exchange=0; for(intj=1;j if(r[j]>r[j+1]) { temp=r[j]; r[j]=r[j+1]; r[j+1]=temp; exchange=j; count++; } } for(i=1;i<=n;i++) printf("%d",r[i]); printf("\n"); } intPartition(intr[],intfirst,intend)//快速排序一次划分 { inti=first; intj=end; r[0]=r[first]; count=1; while(i { while(i r[i]=r[j]; while(i r[j]=r[i]; } r[i]=r[0]; returni;//i为轴值记录的最终位置 } voidQuickSort(intr[],intfirst,intend)//快速排序 { count++; if(first { intpivot=Partition(r,first,end); QuickSort(r,first,pivot-1);//递归地对左侧子序列进行快速排序 QuickSort(r,pivot+1,end);//递归地对右侧子序列进行快速排序 } } voidSelectSort(intr[],intn)//简单选择排序 { count=0; inti,j,index,temp; for(i=1;i { index=i; for(j=i+1;j<=n;j++) { count++; if(r[j] } if(index! =i) { temp=r[i]; r[i]=r[index]; r[index]=temp; } } for(i=1;i<=n;i++) printf("%d",r[i]); printf("\n"); } voidmain() { constintnumv=12; inta[3][numv]={{0,6,13,19,23,37,39,41,45,48,58,86},{0,86,58,48,45,41,39,37,23,19,13,6},{0,23,13,48,86,19,6,41,58,37,45,39}}; intz1[numv],z2[numv]; intm,n,i,j; ints1; printf("请选择测试数据类: 1正序2逆序3随机[若跳出,请按4]\n"); scanf("%d",&m); while(m>0&&m<4) { printf("请选择操作算法: 1直接插入排序2冒泡排序3快速排序4简单选择排序5顺序查找6折半查找\n"); scanf("%d",&n); switch(n) { case1: printf("直接插入排序前: \n"); for(j=1;j printf("%d",a[m-1][j]); printf("\n"); printf("直接插入排序结果为: \n"); BiInsertsort(a[m-1],numv-1); printf("移动了""%d""次\n",count); break; case2: printf("冒泡排序前: \n"); for(j=1;j printf("%d",a[m-1][j]); printf("\n"); printf("冒泡排序结果为: \n"); BubbleSort(a[m-1],numv-1); printf("移动了""%d""次\n",count); break; case3: printf("快速排序前: \n"); for(j=1;j printf("%d",a[m-1][j]); printf("\n"); printf("快速排序结果为: \n"); QuickSort(a[m-1],0,numv-1); for(i=1;i printf("%d",a[m-1][i]); printf("\n"); printf("移动了""%d""次\n",count); break; case4: printf("简单选择排序前: \n"); for(j=1;j printf("%d",a[m-1][j]); printf("\n"); printf("简单选择排序结果为: \n"); SelectSort(a[m-1],numv-1); printf("移动了""%d""次\n",count); break; case5: printf("请输入查找的数: \n"); scanf("%d\n",&s1); i=SepSearch(a[m-1],s1,numv-1); printf("用顺序查找法查找数""%d""在第""%d""位,""比较了""%d""次\n",s1,i+1,count); break; case6: printf("请输入查找的数: \n"); scanf("%d\n",&s1); j=BinSrch(a[m-1],s1,numv-1); printf("用折半查找法查找数""%d""在第""%d""位,""比较了""%d""次\n",s1,i+1,count); break; default: printf("输入错误! \n"); } m=0; printf("请选择测试数据类型: 1正序2逆序3随机[若跳出,请按4]: \n"); scanf("%d",&m); } if(m==4)printf("(*^__^*)再见! \n"); elseprintf("输入错误! \n"); } 实验结果: (1)直接插入排序: (2)冒泡排序: (3)快速排序: (3)快速排序 (4)简单选择排序 (5)顺序查找 (6)折半查找 2.1顺 2结果分析 (1)几种排序法的比较如下表: 排序方法 平均情况 最好情况 最坏情况 辅助空间 直接插入排序 O(n2) O(n) O(n2) O (1) 起泡排序 O(n2) O(n) O(n2) O (1) 快速排序 O(nlog2n) O(nlog2n) O(n2) O(log2n)~O(n) 简单选择排序 O(n2) O(n2) O(n2) O (1) (2)顺序查找 平均查找长度: ASL=1/2(n+1) (3)折半法平均查找长度: ASL=(n+1)/2*log2(n+1)-1 折半法查找方法优点是比较次数少,查找速度快,平均性能好,但要求查找的表为有序,且插入删除困难。 实验体会 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。 通过这次上机实验,增加了我学习算法的兴趣,虽然还不是很懂,但从中也发现程序设计的乐趣,在上机过程中犯的一些错误还会有意外的收获,感觉写算法还是很有意思的。 在具体操作中对这学期所学的数据结构和以前学的C语言的理论知识得到巩固,也发现自己的不足之处,在以后的上机中应更加注意,通过实际操作,学会数据结构书中程序的编写方法和基本步骤,,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验4 查找排序的应用 实验 查找 排序 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)