实验报告一快速排序并行实现-谢有军_第1页
实验报告一快速排序并行实现-谢有军_第2页
实验报告一快速排序并行实现-谢有军_第3页
实验报告一快速排序并行实现-谢有军_第4页
实验报告一快速排序并行实现-谢有军_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

实验目的:通过实现某种排序算法的并行化熟悉openMP的编程原理和基本编写技巧和步骤,并能了解并行算法较串行算法的优越性!实验内容:设计一个排序算法,并将其改成并行算法,观察串行与并行的性能差别实验步骤:3.4.1、快速排序(QuickSort)是一种最基本的排序算法,它的基本思想是:在当前无序区R[1,n]中取一个记录作为比较的“基准”(一般取第一个、最后一个或中间位置的元素),用此基准将当前的无序区R[1,n]划分成左右两个无序的子区R[1,i-1]和R[i,n](1≤i≤n),且左边的无序子区中记录的所有关键字均小于等于基准的关键字,右边的无序子区中记录的所有关键字均大于等于基准的关键字;当R[1,i-1]和R[i,n]非空时,分别对它们重复上述的划分过程,直到所有的无序子区中的记录均排好序为止。3.4.2、串行快速排序算法输入:无序数组data[1,n]输出:有序数组data[1,n]Begin callprocedurequicksort(data,1,n)Endprocedurequicksort(data,i,j)Begin(1) if(i<j)then(1.1)r=partition(data,i,j) (1.2)quicksort(data,i,r-1); (1.3)quicksort(data,r+1,j);endifEndprocedurepartition(data,k,l)Begin(1) pivo=data[l](2) i=k-1(3) forj=ktol-1doifdata[j]≤pivotheni=i+1exchangedata[i]anddata[j]endifendfor(4) exchangedata[i+1]anddata[l](5) returni+1End3.4.3、快速排序算法的性能主要决定于输入数组的划分是否均衡,而这与基准元素选择密切相关。在最坏的情况下,划分的结果是一边有n-1个元素,而另一边有0个素(除去被选中的基准元素)。如果每次递归排序中的划分都产生这种极度的不平衡,么整个算法的复杂度将是Θ(n2)。在最好的情况下,每次划分都使得输入数组平均分为两半,那么算法的复杂度为O(nlogn)。在一般的情况下该算法仍能保持O(nlogn)的复杂度,只不过其具有更高的常数因子。3.4.4、快速排序算法并行化的一个简单思想是,对每次划分过后所得到的两个序列分别使用两个线程完成递归排序。例如对一个长为n的序列,首先划分得到两个长为n/2的序列,将其交给两个线程分别处理;而后进一步划分得到四个长为n/4的序列,再分别交给四个线程处理;如此递归下去最终得到排序好的序列。当然这里举的是理想的划分情况,如果划分步骤不能达到平均分配的目的,那么排序的效率会相对较差。快速排序并行算法:输入:无序数组Data[1,n]输出:有序数组Data[1,n]BeginQuickSort_parallel(Data,0,N-1);EndProcedurepara_quicksort(Data,0,N-1)Beginif(Begin<End) { r=Partition(Data,Begin,End);#pragmaompparallel {#pragmaompsections//nowait {#pragmaompsection QuickSort_parallel(Data,Begin,r);#pragmaompsection QuickSort_parallel(Data,r+1,End); } } }End源代码://omp_section.cpp:定义控制台应用程序的入口点。//#include<stdafx.h>#include<stdlib.h>#include<omp.h>#include<time.h>intPartition(int*data,intstart,intend){ intpivo; inti,j; inttmp; pivo=data[end]; i=start-1; /*i(活动指针)*/ for(j=start;j<end;j++) if(data[j]<=pivo) { i++; /*i表示比pivo小的元素的个数*/ tmp=data[i]; data[i]=data[j]; data[j]=tmp; } tmp=data[i+1]; data[i+1]=data[end]; data[end]=tmp; /*以pivo为分界,data[i+1]=pivo*/ returni;}int*QuickSort_parallel(int*Data,intBegin,intEnd){ intr; if(Begin<End) { r=Partition(Data,Begin,End);#pragmaompparallel {#pragmaompsectionsnowait {#pragmaompsection QuickSort_parallel(Data,Begin,r);#pragmaompsection QuickSort_parallel(Data,r+1,End); } } } returnData;}voidmain(){ intN; printf("输入个数:"); scanf_s("%d",&N); //for(inti=0;i<N;i++) // cout<<rand()<<endl; int*Data; Data=newint[N]; for(inti=0;i<N;i++) Data[i]=rand(); //for(inti=0;i<N;i++) //cout<<Data[i]<<endl; clock_ttimeBegin=clock(); Data=QuickSort_parallel(Data,0,N

温馨提示

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

评论

0/150

提交评论