收藏 分享(赏)

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

上传人:精品资料 文档编号:8310709 上传时间:2019-06-19 格式:DOC 页数:20 大小:280.50KB
下载 相关 举报
并行计算实验快速排序的并行算法.doc_第1页
第1页 / 共20页
并行计算实验快速排序的并行算法.doc_第2页
第2页 / 共20页
并行计算实验快速排序的并行算法.doc_第3页
第3页 / 共20页
并行计算实验快速排序的并行算法.doc_第4页
第4页 / 共20页
并行计算实验快速排序的并行算法.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

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,nBegincall procedure quicksort(data,1,n)Endprocedure

3、 quicksort(data,i,j)Begin(1) if (i#include #define TRUE 1/* 函数名: main* 功能:实现快速排序的主程序* 输入:argc 为命令行参数个数;* argv 为每个命令行参数组成的字符串数组。* 输出:返回 0 代表程序正常结束初 始 化MPI_nit(MPI_Com_rak(ICOM_WORLD,size_ ,Sum处 理 机 (yID=0)获 取 待 排 序 数 组 的 长 度动 态 生 成 待 排 序 序 列从 根 处 理 器 将 数 据 序 列 广 播 到 其 他 处 理 器 MPI_Bcast调 度 执 行 排 序 par

4、_QuickSort(dat,0DatSize-1,m0,yID);ID号 为 0的 处 理 器 打 印 排 序 完 的 有 序 序 列由 第 id号 处 理 器 划 分 数 据 , 并 将 后 一 部 分 数 据 发 送 到 处 理 器 id+exp2(m-1)(1.3)Pid sen datr+1,end toP(id+2m-1)MPI_Send(at+r1, t,I,d1,P(1.2) Pid: r=patrion(dat,ij)r=arton(,str,e;处 理 器 id+exp2(m-1)接 受 处 理 器 id发 送 的 消 息递 归 调 用 并 行 排 序用 2m-1个 处 理

5、 器 对 star-(r1)的 数 据 进 行 递 归 排 序用 个 处 理 器 对 (+)end的 数 据 进 行 递 归 排 序将 排 序 好 的 数 据 由 处 理 器 id+exp2(m-1)发 回 id号 处 理 器*/int GetDataSize();para_QuickSort(int *data,int 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);i

6、nt 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_Status status;/*启动 MPI 计算*/MPI_Init(/*MPI_COMM_WORLD 是通信子*/*确定自己的进程标志符 MyID*/MPI_Comm_rank(MPI_COMM_WORLD,/*组内进程数是 SumID*/MPI_Comm_size(MPI_COMM_WORL

7、D,/*根处理机(MyID=0)获取必要信息,并分配各处理机进行工作*/if(MyID=0)/*获取待排序数组的长度*/DataSize=GetDataSize();data=(int *)malloc(DataSize*sizeof(int);/*内存分配错误*/if(data=0) ErrMsg(“Malloc memory error!“);/*动态生成待排序序列*/srand(396);for(i=0;i0)/* 在下面添加一条语句 */para_QuickSort(data,start,r-1,m-1,id,MyID);/*用 2m-1 个处理器对(r+1)-end 的数据进行递归排

8、序*/j=MyLength;MPI_Bcast(/*(1.5) para_quicksort(data,r+1,j,m-1,id+2m-1)*/if(j0)/* 在下面添加一条语句 */para_QuickSort(tmp,0,MyLength-1,m-1,id+exp2(m-1),MyID);/*将排序好的数据由处理器 id+exp2(m-1)发回 id 号处理器,对应于算法步骤(1.6)*/*(1.6) P(id+2m-1) send datar+1,m-1 back to Pid */if(MyID=id+exp2(m-1) if(MyID=id) /* 函数名: QuickSort*

9、功能:对起止位置为 start 和 end 的数组序列,进行串行快速排序。* 输入:无序数组 data1,n* 返回:有序数组 data1,n*/QuickSort(int *data,int start,int end)int r;int i;if(start0)num-;i=i*2;return i;/* 函数名: log2* 功能:求以 2 为底的 num 的对数* 输入:int 型数据 num* 返回: 以 2 为底的 num 的对数*/int log2(int num)int i, j;i=1;j=2;while(jnum)i-;return i;/* 函数名: GetDataSiz

10、e* 功能:读入待排序序列长度*/int GetDataSize()int i;while(TRUE)printf(“Input the Data Size :“);scanf(“%d“,/*读出正确的 i,返回;否则,继续要求输入*/if(i0) 6.7. 4: 8.9. 5: srand(int)time(0);10.11. 6: 12.13. 7: for(i = 0; i j)24.25. 13: k+;26.27. 14: 28.29. 15: 30.31. 16: positioni-start = k;32.33. 17: 34.35. 18: 36.37. 19: return

11、 position;38.39. 20: 复制代码其中 my_malloc 函数的作用为动态分配大小为 size 的空间,如分配失败,则终止程序:1. 1: void *my_malloc(int malloc_size)2.3. 2: void *buffer;4.5. 3: 6.7. 4: if(buffer = (void *)malloc(size_t)malloc_size) = NULL)8.9. 5: printf(“malloc failure“);10.11. 6: exit(EXIT_FAILURE);12.13. 7: 14.15. 8: 16.17. 9: return

12、 buffer;18.19. 10: 复制代码3、 算法主函数:1. 1: void serial()2.3. 2: 4.5. 3: int i;6.7. 4: int array_length = ARRAY_LENGTH;8.9. 5: 10.11. 6: int *init_array;12.13. 7: int *sort_array;14.15. 8: int *position;16.17. 9: 18.19. 10: / array_length = get_array_length(4);20.21. 11: 22.23. 12: sort_array = (int *)my_

13、malloc(sizeof(int) * array_length);24.25. 13: init_array = (int *)my_malloc(sizeof(int) * array_length);26.27. 14: 28.29. 15: array_builder(init_array, array_length);30.31. 16: 32.33. 17: position = get_array_elem_position(init_array, array_length, 0, array_length);34.35. 18: 36.37. 19: for(i = 0; i array_length; i+)38.39. 20: sort_arrayposition = init_array;40.41. 21: 42.43. 22: printf(“串行实行结果:n“);44.45. 23: init_sort_array_print(init_array, sort_array, array_length);46.47. 24:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报