




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验二:用分治法查找k1-k2问题实验内容从包含n个整数的无序列表中输出第k1小到第k2小之间的所有整数,其中k1=k2。分析时间复杂度。必须用分治法求解,但是不能简单地重复使用求第k小元素的分治法。禁止使用排序算法求解给出复杂度分析过程 算法思想在解决实验的过程中参考了快速排序中双向扫描的思想。快速排序是一种基于分治技术的重要排序算法。首先选择一个元素,接下来根据该元素的值来划分数组。中轴之前的是小于中轴的数,之后的为大于中轴的数。在这个问题中我们只需要在找到中轴位K1和K2时跳出快排,输出第K1到K2的元素,便得问题的解。在寻找中轴的过程中如果遇到k2则不需要二次快排,否则再次查找中轴为k2。数据结构:顺序表算法1Quicksort(Sqlist &L,int low,int high,int k1,int k2,int &temp) /用Quicksort对子数组排序/快排到中轴为k1返回/输出:k1将数组分为k1前和k1后两部分if(lowk1)/如果k1小于中轴,对low到s-1部分快排if(s=k2)temp=1;/中轴为k2记录temp为真Quicksort(L,low,s-1,k1,k2,temp);else if(sk1)/如果k1大于中轴,对s到high部分快排Quicksort(L,s+1,high,k1,k2,temp);else if(s=k1)/如果k1等于于中轴跳出递归将数组分为大于k1和小于k2两部分return ;Partition(Sqlist &L,int low,int high)/以L.elem0为限位器,以第一个元素为中轴, /输入:顺序表的子顺序表L.elemlow-high/输出:顺序表的一个分区,分裂点的位置作为函数的返回值while(lowhigh) while(low=pivotkey)/ 从表的两端交替地向中间扫描-high;L.elemlow=L.elemhigh;/将比中轴小的记录交替到低端while(lowhigh & L.elemlow=pivotkey)+low;L.elemhigh=L.elemlow;/将比中轴大的记录交替到高端L.elemlow=L.elem0;/中轴记录到位return low; 实验过程1、 源程序/*/*从包含n个整数的无序列表中输出第K1小道第k2小之间的所有整数,其中*/*k1=k2,分析时间复杂度,在这里采用快排的思想分别找出中轴为k1 和k2*/*时输出k1和k2之间的数,便为所需*/*88#includeusing namespace std;/*结构体*struct Sqlist int *elem;/元素指针int length;/长度int listsize;/;/*构造一个空的线性顺序表*void InitList_Sq(Sqlist &L)L.elem=(int *)malloc(100*sizeof(int);/开辟空间L.length=0;L.listsize=100;/初始化/*快排的分区过程*int Partition(Sqlist &L,int low,int high)int pivotkey;L.elem0=L.elemlow;/以L.elem0为限位器pivotkey=L.elemlow;/以第一个元素为中轴while(lowhigh)/从表的两端交替地向中间扫描while(low=pivotkey)-high;L.elemlow=L.elemhigh;/将比中轴小的记录交替到低端while(lowhigh & L.elemlow=pivotkey)+low;L.elemhigh=L.elemlow;/将比中轴大的记录交替到高端L.elemlow=L.elem0;/中轴记录到位return low;/返回中轴位置/*用递归选择中轴,根据中轴调用函数int Partition(Sqlist &L,int low,int high)分区,/当中轴为K1时跳出递归*void Quicksort(Sqlist &L,int low,int high,int k1,int k2,int &temp)int s;if(lowk1)/如果k1小于中轴,对low到s-1部分快排if(s=k2)temp=1;Quicksort(L,low,s-1,k1,k2,temp);else if(sk1)/如果k1大于中轴,对s到high部分快排Quicksort(L,s+1,high,k1,k2,temp);else if(s=k1)/如果k1等于于中轴跳出递归将数组分为大于k1和小于k2两部分return ;/*打印第k1小到k2小的元素*void Print(Sqlist L,int k1,int k2)for(int i=k1;i=k2;i+)coutL.elemi ;coutendl;/*主函数*int main()int n,k1,k2,temp=0;Sqlist List;InitList_Sq(List);/初始化顺序表cout请输入无序数列中整数的个数:n;cout请以空格键隔开输入无序数列:endl;/用户输入无序列表for(int i=1;iList.elemi;cout您输入的无序数列为:endl;Print(List,1,n);/打印序列cout请输入输出整数的范围:(如第4小到的8小:4 8 )k1k2;Quicksort(List,1,n,k1,k2,temp);/*一次快排cout当找到中轴为k1后整数的排列情况endl;Print(List,1,n);/*一次快排后数组情况if(temp)/在找到中轴为k1前已经遇到k2为中轴cout在找到中轴为k1前已经遇到k2为中轴,所以第K1小到第k2小之间的所有整数为:endl;Print(List,k1,k2);else/在遇到k1之前并未遇到k2所以再次快排分区Quicksort(List,k1,n,k2,k1,temp);/*二次快排cout在找到中轴为k1前未遇到k2为中轴,通过找k2为中轴后整数的排列情况为:endl;Print(List,1,n);cout第K1小到第k2小之间的所有整数为:1时,最差:C(n)=C(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 偏瘫的评定技术
- 生产班组月汇报
- 外科常用化疗药物注意事项
- 危险地点的讲解
- 全站仪技术交底
- 新生儿医院感染防控与手卫生管理
- 现代医药物流发展与管理体系
- 脑瘫儿童康复作业治疗
- 企业经营模拟实训汇报
- 升学宴营销活动策划方案
- 粮食机收减损培训课件
- 2025餐饮劳动合同书 电子版
- (2025)职业教育法知识竞赛题库带含答案
- CJ/T 449-2014切断型膜式燃气表
- 滨州海上风电项目可行性研究报告
- 人工智能赋能中小学教育:个性化学习路径优化研究
- 2025年月嫂考证:母婴护理师等技能资格知识考试题与答案
- 脑脊液相关试题及答案
- T/CAEPI 64-2023固体回收燃料分类与分级
- DB62T 25-3016-2016 建筑工程资料管理规程
- 围术期患者的专家共识
评论
0/150
提交评论