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)
OpenMP之枚举排序的更多相关文章
- 枚举+排序|神奇算式|2014年蓝桥杯A组题解析第三题-fishers
标题:神奇算式 由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成. 比如: 210 x 6 = 1260 8 x 473 = 3784 27 x 81 = 2187 都符合要求. ...
- OpenMP 奇偶换排序
▶ 使用 OpenMP 进行奇偶交换排序 ● 代码 #include <stdio.h> #include <stdlib.h> #include <omp.h> ...
- Word Amalgamation(枚举 + 排序)
Word Amalgamation Time Limit: 1 Sec Memory Limit: 64 MB Submit: 373 Solved: 247 Description In mil ...
- 基于 OpenMP 的奇偶排序算法的实现
代码: #include <omp.h> #include <iostream> #include <cstdlib> #include <ctime> ...
- sicily 1046. Plane Spotting(排序求topN)
DescriptionCraig is fond of planes. Making photographs of planes forms a major part of his daily lif ...
- 【uva 1312】Cricket Field(算法效率--技巧枚举)
题意:一个 L*R 的网格里有 N 棵树,要求找一个最大空正方形并输出其左下角坐标和长.(1≤L,R≤10000, 0≤N≤100) 解法:枚举空正方形也就是枚举空矩阵,先要固定一个边,才好继续操作. ...
- USACO(含training section)水题合集[5/未完待续]
(1) USACO2.1 Ordered Fractions 枚举 排序即可,注意1/1 #include<iostream> #include<cstdio> #includ ...
- CUBRID学习笔记 25 数据类型2
---恢复内容开始--- 6枚举类型 语法 <enum_type> : ENUM '(' <char_string_literal_list> ')' <char_str ...
- uva331 - Mapping the Swaps
Mapping the Swaps Sorting an array can be done by swapping certain pairs of adjacent entries in the ...
随机推荐
- ————weak 和————block
Blocks理解: Blocks可以访问局部变量,但是不能修改 如果修改局部变量,需要加__block __block int multiplier = 7; int (^myBlock)(int) ...
- [题解]codevs1001 舒适的路线
h3 { font-family: Consolas; color: #339966 } .math { font-family: Consolas; color: gray } 题目描述 Descr ...
- NGUI 多场景情况下 管理多个界面
简单的说就是在一个AllUI场景中,所有场景所需要的界面都挂在一个Empty GameObject下,然后这个Empty GameObject在代码中DontDestroyOnLoad,但是回到这个A ...
- OC中类别、扩展、协议与委托
一.类别(category) 类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法.(类别,接口部分的定义 ...
- Java动手动脑(二)
1>类的对象实例化 由于main为静态类型,所以在调用函数时也必须调用静态方法,如上代码中的求平方数的静态方法,如何在静态main中调用非静态类的方法呢? 静态方法只能直接访问静态成员,无法访问 ...
- MySQL-->基础-->002-->MySQL存储引擎
mysql的存储引擎主要有:MyISAM和InnoDB MyISAM和InnoDB的主要区别:InnoDB支持事务和参照完整性(即为主键约束,数据库的主键和外键类型一定要一致) 存储引擎是针对表而言而 ...
- JavaWeb技术(一):JDBC简介
一. JDBC简介 1. Java Database Connectivity(JDBC) 使用JDBC可以对数据库进行访问 2. JDBC的核心接口 1)DriverManager 驱动管理器接口 ...
- 用c和c++的方式实现栈
#include <stdio.h> #include <stdlib.h> #include <assert.h> struct LinkNode { int d ...
- Spring @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
背景 昨天一个人瞎倒腾spring boot,然后遇到了一点问题,所以把这个问题总结一下. 主要讲解request 数据到handler method 参数数据的绑定,所用到的注解和什么情形下使用. ...
- 关闭ctrl+shift+d截图
关闭ctrl+shift+d截图,最近用sublime text3的时候,用ctrl+shift+d,总是跳出来截图,找了半天,原来是百度浏览器的截图功能快捷键是ctrl+shift+d, 关掉即可