枚举排序各种并行之OpenMP
来源:互联网 发布:webpack this windows 编辑:程序博客网 时间:2024/05/18 00:24
1.OpenMP(利用parallel for将其数据自动分开,数据划分)
//枚举排序/*枚举排序(Enumeration Sort)是一种最简单的排序算法,通常也称为秩排序(Rank Sort)。该算法的具体思想是(假设按关键字递增排序),对每一个待排序的元素统计小于它的所有元素的个数,从而得到该元素最终处于序列中的位置。假定待排序的n个数存在a[1]…a[n]中。首先将a[1]与a[2]…a[n]比较,记录比其小的数的个数,令其为HX_k,a[1]就被存入有序的数组b[1]…b[n]的b[HX_k+1]位置上;然后将a[2]与a[1],a[3]…a[n]比较,记录比其小的数的个数,依此类推。*/#include "stdafx.h"#include <Windows.h>#include <omp.h>#include <time.h>#include <iostream>using namespace std;#define NUM_THREADS 2/* * 函数名: GetDataSize * 功能: 读入待排序序列的长度 * 输入: 待排序序列的长度 * 输出: 返回待排序序列的长度 */ int GetDataSize() { int HX_i; while(1){ printf("请输入数组的大小 :"); scanf("%d",&HX_i); if(HX_i>0) break; //cout<<"Wrong Data Size, must between [1..65535]"<<endl; } return HX_i; } int _tmain(int argc, _TCHAR* argv[]){int HX_i,HX_j,HX_k;clock_t HX_t1,HX_t2;omp_set_num_threads(NUM_THREADS);int HX_DataSize; /*HX_DataSize:数组长度;*/ int *HX_data_in, *HX_data_out; /*输入和输出数组指针*/ HX_DataSize=GetDataSize(); /*HX_DataSize:数组长度;*/HX_data_in=(int *)malloc(HX_DataSize*sizeof(int)); /*分配待排序序列的空间*/if(HX_data_in==0) cout<<"Malloc memory error!"<<endl;HX_data_out=(int *)malloc(HX_DataSize*sizeof(int)); /*分配排序后数组的空间*/ if(HX_data_out==0) cout<<"Malloc memory error!"<<endl;//获得随机数int HX_seed; printf("请输入随机数的种子:"); scanf("%d",&HX_seed); /*获得随机数的种子*/ srand(HX_seed); /*srand初始化随机种子*/ printf("获得随机数\n"); for(HX_i=0;HX_i<HX_DataSize;HX_i++){ HX_data_in[HX_i]=((int)rand())%100000; /*生成随机数,并输出*/ //printf("%10d ",HX_data_in[HX_i]); }printf("\n\n\n");//并行——————————;HX_t1=clock();#pragma omp parallel private(HX_i,HX_j,HX_k){#pragma omp forfor (HX_i=0;HX_i<HX_DataSize;HX_i++){HX_k=0;for (HX_j=0;HX_j<HX_DataSize;HX_j++){if (HX_data_in[HX_i]>HX_data_in[HX_j]){HX_k++;//记录比自己小的数的个数}}HX_data_out[HX_k]=HX_data_in[HX_i];}}HX_t2=clock();cout<<"并行时间="<<HX_t2-HX_t1<<endl;printf("并行结果:\n");for (HX_i=0;HX_i<HX_DataSize;HX_i++){ //printf("%10d ",HX_data_out[HX_i]);}printf("\n\n\n");//串行————————————;HX_t1=clock();for (HX_i=0;HX_i<HX_DataSize;HX_i++){HX_k=0;for (HX_j=0;HX_j<HX_DataSize;HX_j++){if (HX_data_in[HX_i]>HX_data_in[HX_j]){HX_k++;}}HX_data_out[HX_k]=HX_data_in[HX_i];}HX_t2=clock();cout<<"串行时间="<<HX_t2-HX_t1<<endl;printf("串行结果:\n");for (HX_i=0;HX_i<HX_DataSize;HX_i++){//printf("%10d ",HX_data_out[HX_i]);}printf("\n\n\n");system("pause");return 0;}
测试结果正确性:
测试加速比:
0 0
- 枚举排序各种并行之OpenMP
- 枚举排序各种并行之MPI
- 枚举排序各种并行之Win32API
- OpenMP之枚举排序
- 并行编程之OpenMP
- OpenMP: OpenMP并行快速排序算法
- OpenMP并行程序设计之OpenMP使用入门
- 多核并行编程之OpenMP
- 程序优化之并行OpenMP
- 利用OpenMP实现并行快速排序算法
- OpenMp之快速排序
- OpenMP: OpenMP并行程序设计
- OpenMP: OpenMP嵌套并行
- OpenMP: OpenMP嵌套并行
- OpenMP之并行程序开发设计
- 并行计算之OpenMP入门简介
- MPI并行实现枚举排序
- OpenMP并行编程计算π值及PSRS排序
- set----散列集
- Java GC 调试手记
- ubuntu 输入法图标消失解决办法
- 大牛技术博客分享
- MMORPG大型游戏设计与开发(part6 of net)
- 枚举排序各种并行之OpenMP
- HDU-4438-Hunters
- Phoenix Tips (10) 分页查询
- HDU 3535 背包综合
- linux 磁盘空间不足
- 判断三角形的性质
- 【BestCoder】 HDOJ 5103 RootedTree
- HDU 5102 树分治
- 香港银行高管变杀人狂魔 5天杀害2名妓女