OpenMP之枚举排序

// EnumSort.cpp : 定义控制台应用程序的入口点。
//枚举排序
/*
枚举排序(Enumeration Sort)是一种最简单的排序算法,通常也称为秩排序(Rank Sort)。
该算法的具体思想是(假设按关键字递增排序),对每一个待排序的元素统计小于它的所有元素的个数,从而得到该元素最终处于序列中的位置。
假定待排序的n个数存在a[1]…a[n]中。首先将a[1]与a[2]…a[n]比较,记录比其小的数的个数,令其为k,
a[1]就被存入有序的数组b[1]…b[n]的b[k+1]位置上;然后将a[2]与a[1],a[3]…a[n]比较,记录比其小的数的个数,依此类推。
这样的比较操作共n(n-1)次,所以串行秩排序的时间复杂度为O(n2)。
*/
#include "stdafx.h"
#include <Windows.h>
#include <omp.h>
#include <time.h>
#include <iostream>
using namespace std;

#define NUM_THREADS 2
#define maxN 100000
int _tmain(int argc, _TCHAR* argv[])
{
	int i,j,k;
	clock_t t1,t2;
	omp_set_num_threads(NUM_THREADS);
	int a[maxN];//={0,4,9,6,1,5,3,8,7,2};
	int b[maxN];
	//并行——————————;
	for (i=0;i<maxN;i++)
	{
		a[i]=maxN-i;
	}
	t1=clock();
#pragma omp parallel sections private(i,j,k)
	{
/*#pragma omp for
		for (i=0;i<maxN;i++)
		{
			k=0;
			for (j=0;j<maxN;j++)
			{
				if (a[i]>a[j])
				{
					k++;
				}
			}
			b[k]=a[i];
		}*/
#pragma omp section
		{
			for (i=omp_get_thread_num();i<maxN;i=i+NUM_THREADS)
			{
				k=0;
				for (j=0;j<maxN;j++)
				{
					if (a[i]>a[j])//找出数组中比自己小的元素的个数k;
					{
						k++;
					}
				}
				b[k]=a[i];//另外建立一个数组,将其放到第k+1处;
			}
		}
#pragma omp section
		{
			for (i=omp_get_thread_num();i<maxN;i=i+NUM_THREADS)
			{
				k=0;
				for (j=0;j<maxN;j++)
				{
					if (a[i]>a[j])
					{
						k++;
					}
				}
				b[k]=a[i];
			}
		}
	}
	t2=clock();
	cout<<"并行时间:"<<t2-t1<<endl;
	for (i=99900;i<maxN;i++)
	{
		cout<<b[i]<<" ";
	}
	cout<<endl;

	//串行————————————;
	for (i=0;i<maxN;i++)
	{
		a[i]=maxN-i;
	}
	t1=clock();
	for (i=0;i<maxN;i++)
	{
		k=0;
		for (j=0;j<maxN;j++)
		{
			if (a[i]>a[j])
			{
				k++;
			}
		}
		b[k]=a[i];
	}
	t2=clock();
	cout<<"串行时间:"<<t2-t1<<endl;
	for (i=99900;i<maxN;i++)
	{
		cout<<b[i]<<" ";
	}
	cout<<endl;
	system("pause");
	return 0;
}

运行结果如下图:(相对加速比:1.72)

时间: 2024-08-07 17:02:05

OpenMP之枚举排序的相关文章

POJ 1256 Anagram(输入可重集枚举排序)

[题意简述]:本题题意很好理解!题目给出的Hint,使我们对关键点有了更加清晰的认识 An upper case letter goes before the corresponding lower case letter. So the right order of letters is 'A'<'a'<'B'<'b'<...<'Z'<'z'. 就是给一个序列(序列可以有重复的元素),让我们输出它的所有排列,字母顺序规定给出! [分析]:这道题是我之前学习枚举排序和子

POJ 1146 ID Codes(枚举排序)

[题意简述]:求下一个排列 [分析]:同1833一样,如果用STL 一下就解决了,最好自己写函数. // 192K 0Ms #include<iostream> #include<cstring> #include<algorithm> using namespace std; char alphabit[51]; int main() { int i,j,len; while(1) { cin>>alphabit; if(alphabit[0] == '#

基于 OpenMP 的奇偶排序算法的实现

代码: #include <omp.h> #include <iostream> #include <cstdlib> #include <ctime> using namespace std; const int NUM = 8000; const int MAX = 1000000; const int MIN = 0; const int NUM_THREADS = 8; int arr[NUM]; int main() { cout <<

sicily 1046. Plane Spotting(排序求topN)

DescriptionCraig is fond of planes. Making photographs of planes forms a major part of his daily life. Since he tries to stimulate his social life, and since it’s quite a drive from his home to the airport, Craig tries to be very efficient by investi

【uva 1312】Cricket Field(算法效率--技巧枚举)

题意:一个 L*R 的网格里有 N 棵树,要求找一个最大空正方形并输出其左下角坐标和长.(1≤L,R≤10000, 0≤N≤100) 解法:枚举空正方形也就是枚举空矩阵,先要固定一个边,才好继续操作.(P.S.许多类型的题都是这样:先固定一个变量,再比较另外的变量.这种思想在贪心.DP等都常出现,一定要掌握!)所以这题就是先枚举一条边的范围(横坐标),再枚举排序后的点,根据当前枚举的点和之前纵坐标最大的点的纵坐标得到这条边的长度,再比较.更新答案. P.S.我这题打了2个小时!??º·(? ??

天神下凡题解

题目描述 Czy找到宝藏获得屠龙宝刀和神秘秘籍!现在他要去找经常ntr他的Jmars报仇-- Czy学会了一招"堕天一击",他对一个地点发动堕天一击,地面上就会留下一个很大的圆坑.圆坑的周围一圈能量太过庞大,因此无法通过.所以每次czy发动技能都会把地面分割.Jmars拥有好大好大的土地,几十眼都望不到头,所以可以假设土地的大小是无限大.现在czy对他发动了猛烈的攻击,他想知道在泽宇攻击之后他的土地被切成几份了? Czy毕竟很虚,因此圆心都在x坐标轴上.另外,保证所有圆两两之间不会相交

20160522~20160528

20160523 bzoj2561 http://www.lydsy.com/JudgeOnline/problem.php?id=2561 题意:给定一个连通无向图,假设现在加入一条边权为L的边(u,v),求需要删掉最少多少条边,才能够使得这条边既可能出现在最小生成树上,也可能出现在最大生成树上.N≤20000,M≤200000 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4

USACO(含training section)水题合集[5/未完待续]

(1) USACO2.1 Ordered Fractions 枚举 排序即可,注意1/1 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N=165,L=1e5; struct fr{ int a,b; fr(int q=0,int w=1):a(q),b(w){} }f[L]; int n,cnt

hdoj 2883 kebab 【经典最大流】

题目:hdoj 2883 kebab 题意:现在有n个人要烤肉,有m个烤肉架,然后给出每个人的烤肉开始时间si,结束时间ei,以及要烤肉的串数num,还有拷一串的时间ti,然后问你能不能满足所有人的要求. 分析:这是一个比较经典的最大流,经典在于建图方法,这个题目难点在于时间跨度在0---100 0000,如果时间短的话就可以用题目3572的做法了.点击打开链接 后面看了别人的建图方法,确实比较经典,经典在于把区间缩点了,这个题目的难点在于时间跨度大,那么我们可以把所有的时间点记录下来,然后排序