- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法设计与分析第五章算法设计与分析第五章
第五章 作业答案
1、
伪代码:假设查找范围是有序的,ab
1. low=1;high=n; //设置初始查找区间
2. 测试查找区间[low,high]是否存在,若不存在,则查找失败;
否则
3. 取中间点mid=(low+high)/2; 比较a,b与r[mid],有以下三种情况:
3.1 若ar[mid],则high=mid-1;查找在左半区进行,转2;
3.2 若br[mid],则low=mid+1;查找在右半区进行,转2;
3.3 若ar[mid]并且br[mid],则在左半区对a用折半查找找到对应的r[i]=ar[i-1]a,在右半区对b用折半查找r[j]=br[j+1]b;
4. r[i]到r[j]之间的元素即为问题的解
参考代码:
#includeiostream.h
int i=0;
int j=0;//存储a-b的所有元素的起始下标和终止下标
int finda(int s[],int begin,int end,int a)//查找边界为a的元素
{
if(begin==end)return begin;
else
{
int m=(begin+end)/2;
if(s[m]==a)return m;
else if(s[m]a)return finda(s,begin,m,a);
else return finda(s,m+1,end,a);
}
}
int findb(int s[],int begin,int end,int b)//查找边界为b的元素
{
if(begin==end){
if(s[begin]b) return begin-1;
else return begin;
}
else
{
int m=(begin+end)/2;
if(s[m]==b)return m;
else if(s[m]b)return findb(s,m+1,end,b);
else return findb(s,begin,m,b);
}
}
void find(int s[],int begin,int end,int a,int b)//缩小a-b的查找范围
{
if(begin==end){
if(s[begin]=a)i=begin;
else if(s[begin]=b)j=begin;
}
else
{
int m=(begin+end)/2;
if(s[m]a) find(s,m+1,end,a,b);
else if(s[m]b)find(s,begin,m,a,b);
else {
i=finda(s,begin,m,a);
j=findb(s,m+1,end,b);
}
}
}
void main()
{
int s[]={1,2,5,8,11,24,31,40};
int a=2;
int b=30;
find(s,0,7,a,b);
coutiendsjendl;
}
4、
参考代码:根据程序运行结果显示使用两种方法生成的堆序列不一定一样
#includeiostream.h
const int N=8;
void SiftHeap(int r[],int k,int n)
{
int i=k,j=2*i;
int temp;
while(j=n)
{
if(jnr[j]r[j+1])j++;
if(r[i]r[j])break;
else
{
temp=r[i];
r[i]=r[j];
r[j]=temp;
i=j;j=2*i;
}
}
}
void InsertHeap(int r[],int k)
{
int i=k,j;
int temp;
while(i!=1)
{
j=i/2;
if(r[i]r[j])break;
else{
temp=r[i];
r[i]=r[j];
r[j]=temp;
i=j;
}
}
}
void main()
{
int s[N+1],s1[N+1];
//输入s和s1
for(int i=1;i=N;i++){cins[i];s1[i]=s[i];}
//利用筛选法生成堆
for(i=N;i=1;i--)SiftHeap(s,i,N);
//利用插入法生成堆
for(i=1;i=N;i++)InsertHeap(s1,i);
//输出s和s1
for(i=1;i=N;i++)
couts[i]endss1[i]endl;
}
您可能关注的文档
- 科学 形状与结构科学 形状与结构.doc
- 2014年秋历史学科教学质量分析会发言稿2014年秋历史学科教学质量分析会发言稿.doc
- 科学六上第二单元教学反思科学六上第二单元教学反思.doc
- 2014年第二学期后勤计划2014年第二学期后勤计划.doc
- 2014年科室质量管理与持续改进措施2014年科室质量管理与持续改进措施.doc
- 2014年社团文化艺术节主持稿 2-22014年社团文化艺术节主持稿 2-2.doc
- 2014年上半年计算机二级C语言上机模拟试题及答案22014年上半年计算机二级C语言上机模拟试题及答案2.doc
- 2014年青年志愿者协会新学期工作计划2014年青年志愿者协会新学期工作计划.doc
- 2014年高考广东卷文综政治及参考答案2014年高考广东卷文综政治及参考答案.doc
- 2014广东学业水平测试物理B卷(含答案)2014广东学业水平测试物理B卷(含答案).doc
文档评论(0)