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 for
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");
//串行————————————;
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;
}
测试结果正确性:
测试加速比: