分治法~线性时间选择要点.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《计算机算法设计与分析》实 验 报 告 实验名称:线性时间选择问题 实验地点: 所使用的开发工具及环境: 实验目的: 熟悉掌握分治算法设计技术 二、实验内容: 1、按教材所授内容要求,完成“线性时间选择问题”算法。得到一个完整正确的程序。 2、问题规模:不少于2000 3、输出最终结果。 基本思想、原理和算法描述: 基本思想:将n个输入元素划分成┌ n/5┐个组,每组有5个元素,除最后一组可能不是5个元素之外用任意一种算法,将每组的元素排好序,并取出每组的中位数,共┌ n/5┐个。调用Select找出这┌ n/5┐个元素的中位数,如果┌ n/5┐是偶数就找两个中位数中较大的一个。在这里我用的排序的方法是快速排序。 算法描述: template class Type Type Select(Type a[],int p,int r,int k) { int i; if(r-p75) { Qsort(a,p,r); return a[p+k-1]; } //(r-p-4)/5相当于n-5 for(i=0; i=(r-p-4)/5; i++) { //将元素每5个分成一组,分别排序,并将该组中位数与a[p+i]交换位置 //使所有中位数都排列在数组最左侧,以便进一步查找中位数的中位数 Qsort(a,p+5*i,p+5*i+4); Swap(a[p+5*i+2],a[p+i]); } //找中位数的中位数 Type x = Select(a,p,p+(r-p-4)/5,(r-p-4)/10); i = Partition(a,p,r,x); int j = i-p+1; if(k=j) { return Select(a,p,i,k); } else { return Select(a,i+1,r,k-j); } } 源程序清单: #includestdio.h #includestdlib.h #includetime.h #includewindows.h #includeiostream.h template class Type void Swap(Type x,Type y); inline int Random(int x, int y); template class Type void Qsort(Type a[] ,int p,int r); template class Type int Partition(Type a[],int p,int r,Type x); template class Type Type Select(Type a[],int p,int r,int k); void main() { int a[2000]; srand((unsigned)time(NULL)); for(int i=0; i2000; i++) { a[i] = Random(0,2000); couta[i]:a[i] ; } coutendl; cout第800小元素是Select(a,0,1999,800)endl; //重新排序,对比结果 Qsort(a,0,1999); for( i=0; i2000; i++) { couta[i]:a[i] ; } coutendl; } template class Type void Swap(Type x,Type y) { Type temp = x; x = y; y = temp; } inline int Random(int x, int y) { int ran_num = rand() % (y - x) + x; return ran_num; } template class Type void Qsort(Type a[] ,int p,int r) { if(pr) { Type x; int q=Partition(a,p,r,x); Qsort(a,p,q-1); Qsort(a,q+1,r); } } template class Type int Partition(Type a[],int p,int r,Type x) { int i = p; int j = r + 1; x=a[p]; while(true) { while(a[++i]xir); while(a[--j]x); if(i=j) break; Swap(a[i],a[j]); } a[p]=a[j]; a[j]=x; return

文档评论(0)

光光文挡 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档