舍伍德线性时间选择.docxVIP

  • 11
  • 0
  • 约3.36千字
  • 约 11页
  • 2020-04-02 发布于江西
  • 举报
算法分析与设计实验报告 第 8 次实验 姓名 学号 班级 时间 12.26 下午 地点 四合院 实验名称 Sherwood 型线性时间选择算法 实验目的 1)通过上机实验,要求掌握 Sherwood 型线性时间选择算法的问题描述、算 法设计思想、程序设计。 实验原理 使用舍伍德型选择算法,根据不同的输入用例,能准确的输出用例中的中值, 并计算出程序运行所需要的时间 给定任意几组数据,利用舍伍德型选择算法,找出数组中的中值并输出(若 数组为奇数个则输出中值,若数组为偶数个则输出第 n/2 小元素)。 实验步骤 ① 先判断是否需要进行随机划分即(k?(1,n)?n1?); ② 产生随机数 j,选择划分基准,将 a[j]与 a[l]交换; ③ 以划分基准为轴做元素交换,使得一侧数组小于基准值,另一侧数组 值大于基准值; ④ 判断基准值是否就是所需选择的数,若是,则输出;若不是对子数组 重复步骤②③④。 template class Type inline void Swap(Type a,Type b) { Type temp = a; a = b; b = temp; } //计算 a[l:r]中第 k 小元素 templateclass Type Type select(Type a[],int l,int r,int k) { static RandomNumber rnd; while(true) { if(l=r) { return a[l]; } int i = l, j = l + rnd.Random(r-l+1);//随机选择划分基准 Swap(a[i],a[j]); j = r+1; Type pivot = a[l]; //以划分基准为轴做元素交换 while(true) { while(a[++i]pivot); while(a[--j]pivot); if(i=j) { break; } Swap(a[i],a[j]); } if(j-l+1 == k){ //第 k 小 return pivot; } //a[j]必然小于 pivot,做最后一次交换,满足左侧比 pivot 小,右侧 比 pivot 大 a[l] = a[j]; a[j] = pivot; //对子数组重复划分过程 if(j-l+1k) { = k-j+l-1;//右侧:k-(j-l+1)=k-j+l-1 = j + 1; } else { r = j - 1; } } } //计算 a[0:n-1]中第 k 小元素 //假设 a[n]是一个键值无穷大的元素 templateclass Type Type select(Type a[],int n,int k) { if(k1 || kn) { cout请输入正确的 k!endl; return 0; } return select(a,0,n-1,k); } 测试结果 实验心得 通过这次实验,我回顾了舍伍德线性时间查找问题 本次实验实现起来的代码较长,但在之前的实验中都要求使用舍伍德产 生随机数,因此本次实验还是比较简单的。主要是掌握对随机数 RandomNuber 类的理解。在实现书上代码后,我将代码改进为随机产生序列 的方式,手动选择查找的数组元素(从小到大排序后)的序号,并输出到屏 幕。因此,要想找出最大元素,直接输入查找序号为数组大小即可得,同理 最小元素为序号一,因此可以实现最值求解。 通过本次实验发现,尽管嗯多时候实验的算法内容能在书本上找到,但 是如果能加入自己的理解进行修改代码,也会有很大的收获,因为只有掌握 了思想才能进行修改。 实验得分 助教签名 附录:完整代码 #include time.h using namespace std; //随机数类 const unsigned long maxshort=66536L; const unsigned long multiplier=1194211693L; const unsigned long adder=12345L; class RandomNumber{ private: //当前种子 unsigned long randSeed; public: RandomNumber (unsigned long s=0); //构造函数,默认值 0 表示由系统自动 产生种子 unsigned short Random(unsigned long n); //产生 0:n-1 之间的随机整数 double fRandom(void); //产生[0,1)之间的随机实数 }; RandomNumber::RandomNumber(unsigned long s){ if(s==0) randSeed=time(0);

文档评论(0)

1亿VIP精品文档

相关文档