OpenMP 奇偶换排序
▶ 使用 OpenMP 进行奇偶交换排序
● 代码
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <time.h> const int thread = , dataSize = ; int main0(int argc, char* argv[])// 每次并行时即时产生多个线程
{
int i, j, threadReal, data[dataSize];
clock_t time;
if (argc > && *argv[] > ''&& *argv[] < '')
threadReal = atoi(argv[]);
else
threadReal = thread;
srand();
#pragma omp parallel for num_threads(thread)
for (i = ; i < dataSize; i++)
data[i] = rand(); time = clock();
for (i = ; i < dataSize; i++)
{
if (i % )
{
#pragma omp parallel for num_threads(thread) default(none) shared(data, dataSize) private(j)
for (j = ; j < dataSize - ; j += )
{
if (data[j + ] < data[j])
data[j + ] ^= data[j], data[j] ^= data[j + ], data[j + ] ^= data[j];
}
}
else
{
#pragma omp parallel for num_threads(thread) default(none) shared(data, dataSize) private(j)
for (j = ; j < dataSize; j += )
{
if (data[j - ] > data[j])
data[j - ] ^= data[j], data[j] ^= data[j - ], data[j - ] ^= data[j];
}
}
}
time = clock() - time;
printf("Sort finished!\n");
for (i = ; i < dataSize - ; i++)
{
if (data[i] > data[i + ])
{
printf("Sort error at %d, data[i] = %d,data[i+1] = %d, time = %d ms\n", i, data[i], data[i + ], time);
break;
}
}
if (i == dataSize - )
printf("Sort correct, time = %d ms\n", time);
getchar();
return ;
} int main1(int argc, char* argv[])// 预先产生需要的线程
{
int i, j, threadReal, data[dataSize];
clock_t time;
if (argc > && *argv[] > ''&& *argv[] < '')
threadReal = atoi(argv[]);
else
threadReal = thread;
srand();
#pragma omp parallel for num_threads(thread)
for (i = ; i < dataSize; i++)
data[i] = rand(); time = clock();
#pragma omp parallel num_threads(thread) default(none) shared(data, dataSize) private(i, j) // 预先说明并行的参数,特别是规定使用的线程数
for (i = ; i < dataSize; i++) // 注意这层没有 for 子句,且 i 也作为私有变量
{
if (i % )
{
#pragma omp for// 每次并行时使用预先规定的线程数和参数,使用完毕后保留,直到退出外层循环再销毁
for (j = ; j < dataSize - ; j += )
{
if (data[j + ] < data[j])
data[j + ] ^= data[j], data[j] ^= data[j + ], data[j + ] ^= data[j];
}
}
else
{
#pragma omp for
for (j = ; j < dataSize; j += )
{
if (data[j - ] > data[j])
data[j - ] ^= data[j], data[j] ^= data[j - ], data[j - ] ^= data[j];
}
}
}
time = clock() - time;
printf("Sort finished!\n");
for (i = ; i < dataSize - ; i++)
{
if (data[i] > data[i + ])
{
printf("Sort error at %d, data[i] = %d,data[i+1] = %d, time = %d ms\n", i, data[i], data[i + ], time);
break;
}
}
if (i == dataSize - )
printf("Sort correct, time = %d ms\n", time);
getchar();
return ;
}
● 输出结果与对比
// 每次并行时即时产生多个线程,分别为 1 个线程和 8 个线程
Sort finished!
Sort correct, time = ms
Sort finished!
Sort correct, time = ms // 预先产生需要的线程,分别为 1 个线程和 8 个线程
Sort finished!
Sort correct, time = ms
Sort finished!
Sort correct, time = ms
OpenMP 奇偶换排序的更多相关文章
- 排序算法(7)--exchang Sorting--交换排序[2]--Quick Sort--快速排序
1.基本思想 从待排序列中选取一元素作为轴值(也叫主元). 将序列中的剩余元素以该轴值为基准,分为左右两部分.左部分元素不大于轴值,右部分元素不小于轴值.轴值最终位于两部分的分割处. 对左右两部分重复 ...
- OpenMP之枚举排序
// EnumSort.cpp : 定义控制台应用程序的入口点. //枚举排序 /* 枚举排序(Enumeration Sort)是一种最简单的排序算法,通常也称为秩排序(Rank Sort). 该算 ...
- 排序算法(6)--exchang Sorting--交换排序[1]--Bubble Sort--冒泡排序
1.基本思想 冒泡排序的基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序 2.实现原理 冒泡排序是一种简单的排序算法,根据顺序两 ...
- 算法笔记_049:奇偶数排序(Java)
目录 1 问题描述 2 解决方案 2.1 一头一尾指针往中间扫描法 2.2 一前一后两个指针同时往后扫描法 1 问题描述 给定一个整数数组,请调整 数组中数的顺序,使得所有奇数位于数组的前半部分, ...
- Java实现奇偶数排序
1 问题描述 给定一个整数数组,请调整 数组中数的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分.要求时间复杂度为O(n). 2 解决方案 2.1 一头一尾指针往中间扫描法 pack ...
- Hark的数据结构与算法练习之奇偶排序
算法说明 奇偶排序又叫奇偶换位排序,砖排序.它是一种交换排序,也是冒泡的一个变种 顾名思义,奇偶排序,其实就是先循环奇数位,然后将奇数位与偶数位比较计算. 然后再循环偶数位,再和奇数位比较运算.看一下 ...
- 《Algorithm算法》笔记:元素排序(2)——希尔排序
<Algorithm算法>笔记:元素排序(2)——希尔排序 Algorithm算法笔记元素排序2希尔排序 希尔排序思想 为什么是插入排序 h的确定方法 希尔排序的特点 代码 有关排序的介绍 ...
- ACM模板_axiomofchoice
目录 语法 c++ java 动态规划 多重背包 最长不下降子序列 计算几何 向量(结构体) 平面集合基本操作 二维凸包 旋转卡壳 最大空矩形 | 扫描法 平面最近点对 | 分治 最小圆覆盖 | 随机 ...
- Oralce开窗函数OVER()的一些应用
好久没用oracle了,发现很多东西已经忘记.正好今天改写个语句,顺便回忆了一下,乘热整理以备遗忘. over(order by salary) 按照salary排序进行累计,order by是个默认 ...
随机推荐
- ActiveStorage. 英文书Learnrails5.2的案例,看如何放到云上。
ActiveStorage. 英文书Learnrails5.2的案例 本例子目标:增加一个avatar image给每个用户. 准备: 需要安装Imagemagick software.它可以crea ...
- UVA-10779 Collectors Problem (网络流建模)
题目大意:有n个人,已知每人有ki个糖纸,并且知道每张糖纸的颜色.其中,Bob希望能和同伴交换使得手上的糖纸数尽量多.他的同伴只会用手上的重复的交换手上没有的,并且他的同伴们之间不会产生交换.求出Bo ...
- app手机端连接tomcat电脑端服务器
1.你要在电脑端开启并启动tomcat 2.启动nginx,然后需要在nginx中配置好端口号,每一个app的模块端口号是不一样的,需要你进行更改 3.如下图代表app连接的端口: 4.关于sql过滤 ...
- 【hive】求日期是星期几
在Hive原生版本中,目前并没有返回星期几的函数.除了利用java自己编写udf外,也可以利用现有hive函数实现. 方法格式: pmod(datediff('#date#', '任意年任意一个星期日 ...
- iOS笔记之网络
用POST方式上传数据时,数组怎么处理? NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data ...
- java基础---->Zip压缩的使用
java中提供了对压缩格式的数据流的读写.它们封装到现成的IO 类中,以提供压缩功能.下面我们开始java中压缩文件的使用. 目录导航: 关于压缩的简要说明 GZIP压缩文件的使用 ZIP压缩文件的使 ...
- 解析xml(当节点中有多个子节点)
概要:解析一个xml,当一个节点中又包含多个子节点如何解析,对比一个节点中不包括其他节点的情况. 一,xml样例 <cisReports batNo="查询批次号" unit ...
- Kafka术语解释
前一篇文章介绍了如何使用kafka收发消息,但是对于kafka的核心概念并没有详细介绍,这里将会对包括kafka基本架构以及消费者.生产者API涉及的术语进行说明.了解这些术语有助于更深入理解kafk ...
- Oracle 分析函数及常用函数
什么叫分析函数(Analytic function)? Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组 ...
- c++ istringstream的用法
一.测试代码 istringstream 是将字符串变成字符串迭代器一样,将字符串流在依次拿出,比较好的是,它不会将空格作为流.这样就实现了字符串的空格切割. #include<iostream ...