实验二:查找k1-k2问题实验报告2_第1页
实验二:查找k1-k2问题实验报告2_第2页
实验二:查找k1-k2问题实验报告2_第3页
实验二:查找k1-k2问题实验报告2_第4页
实验二:查找k1-k2问题实验报告2_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验二:用分治法查找 k1-k2问题实验内容从包含n个整数的无序列表中输出第 k1小到第k2小之间的所有整数,其中 k1=k2。分析 时间复杂度。必须用分治法求解,但是不能简单地重复使用求第 k小元素的分治法。禁止使 用排序算法求解给出复杂度分析过程算法思想在解决实验的过程中参考了快速排序中双向扫描的思想。快速排序是一种基于分治技术的重要排序算法。首先选择一个元素,接下来根据该元素的值来划分数组。中轴之前的是小于中轴的数,之后的为大于中轴的数。在这个问题中我们只需要在找到中轴位K1和K2时跳出快排,输出第K1到K2的元素,便得问题的解。在寻找中轴的过程中如果遇到k2则不需要二次快排,否则再次查

2、找中轴为k2o数据结构:顺序表 算法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)

3、如果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;/将

4、比中轴大的记录交替到高端 L.elemlow=L.elem0;/ 中轴记录到位 return low;实验过程1、源程序*/*/*从包含n个整数的无序列表中输出第K1小道第k2小之间的所有整数,其中*k1=k2,分析时间复杂度,在这里采用快排的思想分别找出中轴为k1和*k2*/* 时输出 k1 和 k2 之间的数,便为所需*88#includeusing namespace std;/* 结构体 *struct Sqlistint *elem;/元素指针int length;/ 长度int listsize;/;/*构造一个空的线性顺序表*void InitList_Sq(Sqlist &L)

5、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(lowh

6、igh & 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)te

7、mp=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 ; void Print(Sqlist L,int k1,int k2) /*打印第k1小到k2小的元素*for(int i=k1;i=k2;i+) coutL.elemi coutendl;/* 主函数 *int main()int n,k1,k2,temp=0;Sqlist List;In

8、itList_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(n-1)+n=n*n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论