- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
数据结构与算法分析课内实验报告
实验日期:
姓名:司默涵
学号和班级:2110505018计算机11
指导老师:赵仲孟
实验目的
实现查找和排序两项《数据结构与算法分析》中的重要应用。
培养严谨、踏实的学习、实验态度。
进一步锻炼编程能力,加深对课程内容的理解。
题目〔加粗为所选题目〕
查找方法的实现〔二者选一〕
〔1〕编程实现完整的折半查找算法程序,并举例演示运行过程。
〔2〕编程实现一种Hash查找表算法程序〔选择确定一种Hash函数和冲突解决方法〕,并举例演示运行过程。
排序方法与实现
在Shell排序、快速排序、归并排序、堆排序等排序算法中选择一种算法,编程实现相应算法实现过程,并举例演示算法各趟运行结果。
三、算法设计
折半查找算法
BinarySearch(max,min,des)
mid-(max+min)/2
while(min=max)
mid=(min+max)/2
ifmid=desthen
returnmid
elseifmiddesthen
max=mid-1
else
min=mid+1
returnmax
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(logn)完成搜索任务。它的根本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比拟,如果x=a[n/2]那么找到x,算法终止。如果xa[n/2],那么我们只要在数组a的左半部继续搜索x〔这里假设数组元素呈升序排列〕。如果xa[n/2],那么我们只要在数组a的右半部继续搜索x。
二分查找法一般都存在一个临界值的BUG,即查找不到最后一个或第一个值。可以在比拟到最后两个数时,再次判断到底是哪个值和查找的值相等
快速排序算法
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据〔通常选用第一个数据〕作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
①设置两个变量i、j,排序开始的时候:i=0,j=N-1;
②以第一个数组元素作为关键数据,赋值给key,即?key=A[0];
③从j开始向前搜索,即由后开始向前搜索〔j=j-1即j--〕,找到第一个小于key的值A[j],A[i]与A[j]交换;
④从i开始向后搜索,即由前开始向后搜索〔i=i+1即i++〕,找到第一个大于key的A[i],A[i]与A[j]交换;
⑤重复第3、4、5步,直到I=J;(3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i,j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后令循环结束。〕
四、源程序
〔1〕折半查找算法程序
#includestdio.h
#includestdlib.h
#includetime.h
//函数结果状态代码
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#defineN10000
//定义函数类型status,返回值为状态代码
typedefintstatus;
intf=0;
voidmodInsertSort(int*data,intn,intdelta)
{
inti,j,temp;
for(i=delta;in;i+=delta)
for(j=i;j=delta;j-=delta)
{
if(data[j]data[j-delta])
temp=data[j],data[j]=data[j-delta],data[j-delta]=temp;
else
break;
}
}
voidshellsort(intdata[],intlen)
{
inti,delta;
for(delta=len/2;delta0;delta/=2)
for(i=0;idelta;i++)
文档评论(0)