ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:198.63KB ,
资源ID:2441203      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2441203.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(并行计算实验快速排序的并行算法.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

并行计算实验快速排序的并行算法.docx

1、并行计算实验快速排序的并行算法3.1实验目的与要求1、熟悉快速排序的串行算法2、熟悉快速排序的并行算法 3、实现快速排序的并行算法 3.2 实验环境及软件单台或联网的多台PC机,Linux操作系统,MPI系统。3.3实验内容1、快速排序的基本思想2、单处理机上快速排序算法3、快速排序算法的性能4、快速排序算法并行化5、描述了使用2m个处理器完成对n个输入数据排序的并行算法。 6、在最优的情况下并行算法形成一个高度为logn的排序树7、完成快速排序的并行实现的流程图8、完成快速排序的并行算法的实现3.4实验步骤3.4.1、快速排序(Quick Sort)是一种最基本的排序算法,它的基本思想是:在

2、当前无序区R1,n中取一个记录作为比较的“基准”(一般取第一个、最后一个或中间位置的元素),用此基准将当前的无序区R1,n划分成左右两个无序的子区R1,i-1和Ri,n(1in),且左边的无序子区中记录的所有关键字均小于等于基准的关键字,右边的无序子区中记录的所有关键字均大于等于基准的关键字;当R1,i-1和Ri,n非空时,分别对它们重复上述的划分过程,直到所有的无序子区中的记录均排好序为止。 3.4.2、单处理机上快速排序算法输入:无序数组data1,n输出:有序数组data1,nBegin call procedure quicksort(data,1,n)Endprocedure qui

3、cksort(data,i,j)Begin(1) if (ij) then (1.1)r = partition(data,i,j) (1.2)quicksort(data,i,r-1); (1.3)quicksort(data,r+1,j);end ifEndprocedure partition(data,k,l)Begin(1) pivo=datal(2) i=k-1(3) for j=k to l-1 doif datajpivo theni=i+1exchange datai and datajend ifend for(4) exchange datai+1 and datal(5

4、) return i+1End3.4.3、快速排序算法的性能主要决定于输入数组的划分是否均衡,而这与基准元素的选择密切相关。在最坏的情况下,划分的结果是一边有n-1个元素,而另一边有0个元素(除去被选中的基准元素)。如果每次递归排序中的划分都产生这种极度的不平衡,那么整个算法的复杂度将是(n2)。在最好的情况下,每次划分都使得输入数组平均分为两半,那么算法的复杂度为O(nlogn)。在一般的情况下该算法仍能保持O(nlogn)的复杂度,只不过其具有更高的常数因子。3.4.4、快速排序算法并行化的一个简单思想是,对每次划分过后所得到的两个序列分别使用两个处理器完成递归排序。例如对一个长为n的序列

5、,首先划分得到两个长为n/2的序列,将其交给两个处理器分别处理;而后进一步划分得到四个长为n/4的序列,再分别交给四个处理器处理;如此递归下去最终得到排序好的序列。当然这里举的是理想的划分情况,如果划分步骤不能达到平均分配的目的,那么排序的效率会相对较差。 3.4.5、描述了使用2m个处理器完成对n个输入数据排序的并行算法。 快速排序并行算法输入:无序数组data1,n,使用的处理器个数2m输出:有序数组data1,nBegin para_quicksort(data,1,n,m,0)Endprocedure para_quicksort(data,i,j,m,id)Begin(1) if (

6、j-i)k or m=0 then (1.1) Pid call quicksort(data,i,j) else (1.2) Pid: r=patrition(data,i,j) (1.3) P id send datar+1,m-1 to Pid+2m-1 (1.4) para_quicksort(data,i,r-1,m-1,id) (1.5) para_quicksort(data,r+1,j,m-1,id+2m-1) (1.6) Pid+2m-1 send datar+1,m-1 back to Pid end if End3.4.6、在最优的情况下该并行算法形成一个高度为logn的

7、排序树,其计算复杂度为O(n),通信复杂度也为O(n)。同串行算法一样,在最坏情况下其计算复杂度降为O(n2)。正常情况下该算法的计算复杂度也为O(n),只不过具有更高的常数因子。3.4.7、完成快速排序的并行实现的流程图3.4.8、完成快速排序的并行算法的实现#include #include #define TRUE 1 /* * 函数名: main * 功能:实现快速排序的主程序 * 输入:argc为命令行参数个数; * argv为每个命令行参数组成的字符串数组。 * 输出:返回0代表程序正常结束*/int GetDataSize();para_QuickSort(int *data,i

8、nt start,int end,int m,int id,int MyID);QuickSort(int *data,int start,int end);int Partition(int *data,int start,int end);int exp2(int num);int log2(int num);ErrMsg(char *msg);main(int argc,char *argv) int DataSize; int *data; /*MyID表示进程标志符;SumID表示组内进程数*/ int MyID, SumID; int i, j; int m, r; MPI_Sta

9、tus status; /*启动MPI计算*/ MPI_Init(&argc,&argv); /*MPI_COMM_WORLD是通信子*/ /*确定自己的进程标志符MyID*/ MPI_Comm_rank(MPI_COMM_WORLD,&MyID); /*组内进程数是SumID*/ MPI_Comm_size(MPI_COMM_WORLD,&SumID); /*根处理机(MyID=0)获取必要信息,并分配各处理机进行工作*/ if(MyID=0) /*获取待排序数组的长度*/ DataSize=GetDataSize(); data=(int *)malloc(DataSize*sizeof(

10、int); /*内存分配错误*/ if(data=0) ErrMsg(Malloc memory error!); /*动态生成待排序序列*/ srand(396); for(i=0;iDataSize;i+) datai=(int)rand(); printf(%10d,datai); printf(n); m=log2(SumID); /调用函数:求以2为底的SumID的对数 /* 从根处理器将数据序列广播到其他处理器*/ /*1表示传送的输入缓冲中的元素的个数, */ /* MPI_INT表示输入元素的类型, */ /* 0表示root processor的ID */ MPI_Bcast

11、(&DataSize,1,MPI_INT,0,MPI_COMM_WORLD); /*ID号为0的处理器调度执行排序*/ para_QuickSort(data,0,DataSize-1,m,0,MyID); /*ID号为0的处理器打印排序完的有序序列*/ if(MyID=0) printf(实际应用处理器数:%dn ,exp2(m-1); for(i=0;iDataSize;i+) printf(%10d,datai); printf(n); MPI_Finalize(); /结束计算 return 0;/* * 函数名: para_QuickSort * 功能:并行快速排序,对起止位置为st

12、art和end的序列,使用2的m次幂个处理器进行排序 * 输入:无序数组data1,n,使用的处理器个数2m * 输出:有序数组data1,n*/para_QuickSort(int *data,int start,int end,int m,int id,int MyID) int i, j; int r; int MyLength; int *tmp; MPI_Status status; MyLength=-1; /*如果可供选择的处理器只有一个,那么由处理器id调用串行排序,对应于算法步骤(1.1)*/ /*(1.1) Pid call quicksort(data,i,j) */ i

13、f(m=0) if(MyID=id) QuickSort(data,start,end); return; /*由第id号处理器划分数据,并将后一部分数据发送到处理器id+exp2(m-1),对应于算法步骤(1.2,1.3)*/ /*(1.2) Pid: r=patrition(data,i,j)*/ if(MyID=id) /*将当前的无序区R1,n划分成左右两个无序的子区R1,i-1和Ri,n(1in)*/ r=Partition(data,start,end); MyLength=end-r; /*(1.3) Pid send datar+1,m-1 to P(id+2m-1) */ /

14、* MyLength表示发送缓冲区地址;*/ /* 发送元素数目为1; */ /* MyID是消息标签 */ /* 在下面添加一条语句 发送长度 */ MPI_Send(&MyLength,1,MPI_INT,id+exp2(m-1),MyID,MPI_COMM_WORLD); /*若缓冲区不空,则第id+2m-1号处理器取数据的首址是datar+1*/ if(MyLength!=0) /* 在下面添加一条语句 */ MPI_Send(data+r+1,MyLength ,MPI_INT,id+exp2(m-1),MyID,MPI_COMM_WORLD); /*处理器id+exp2(m-1)接受处理器id发送的消息*/ if(MyID=id+exp2(m-1) /* 在下面添加一条语句 */ MPI_Recv(&MyLength,1,MPI_INT,id,id,MPI_COMM_WORLD,&status); if(MyLength!=0) tmp=(int *)malloc(MyLength*sizeof(int); if(tmp=

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1