▶ 使用 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 奇偶换排序的更多相关文章

  1. 排序算法(7)--exchang Sorting--交换排序[2]--Quick Sort--快速排序

    1.基本思想 从待排序列中选取一元素作为轴值(也叫主元). 将序列中的剩余元素以该轴值为基准,分为左右两部分.左部分元素不大于轴值,右部分元素不小于轴值.轴值最终位于两部分的分割处. 对左右两部分重复 ...

  2. OpenMP之枚举排序

    // EnumSort.cpp : 定义控制台应用程序的入口点. //枚举排序 /* 枚举排序(Enumeration Sort)是一种最简单的排序算法,通常也称为秩排序(Rank Sort). 该算 ...

  3. 排序算法(6)--exchang Sorting--交换排序[1]--Bubble Sort--冒泡排序

    1.基本思想 冒泡排序的基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序 2.实现原理 冒泡排序是一种简单的排序算法,根据顺序两 ...

  4. 算法笔记_049:奇偶数排序(Java)

    目录 1 问题描述 2 解决方案 2.1 一头一尾指针往中间扫描法 2.2 一前一后两个指针同时往后扫描法   1 问题描述 给定一个整数数组,请调整 数组中数的顺序,使得所有奇数位于数组的前半部分, ...

  5. Java实现奇偶数排序

    1 问题描述 给定一个整数数组,请调整 数组中数的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分.要求时间复杂度为O(n). 2 解决方案 2.1 一头一尾指针往中间扫描法 pack ...

  6. Hark的数据结构与算法练习之奇偶排序

    算法说明 奇偶排序又叫奇偶换位排序,砖排序.它是一种交换排序,也是冒泡的一个变种 顾名思义,奇偶排序,其实就是先循环奇数位,然后将奇数位与偶数位比较计算. 然后再循环偶数位,再和奇数位比较运算.看一下 ...

  7. 《Algorithm算法》笔记:元素排序(2)——希尔排序

    <Algorithm算法>笔记:元素排序(2)——希尔排序 Algorithm算法笔记元素排序2希尔排序 希尔排序思想 为什么是插入排序 h的确定方法 希尔排序的特点 代码 有关排序的介绍 ...

  8. ACM模板_axiomofchoice

    目录 语法 c++ java 动态规划 多重背包 最长不下降子序列 计算几何 向量(结构体) 平面集合基本操作 二维凸包 旋转卡壳 最大空矩形 | 扫描法 平面最近点对 | 分治 最小圆覆盖 | 随机 ...

  9. Oralce开窗函数OVER()的一些应用

    好久没用oracle了,发现很多东西已经忘记.正好今天改写个语句,顺便回忆了一下,乘热整理以备遗忘. over(order by salary) 按照salary排序进行累计,order by是个默认 ...

随机推荐

  1. 不管服不服 Windows仍是全球第一大桌面系统

    不管服不服 Windows仍是全球第一大桌面系统 近日,根据来自市场调研机构 Net Applications 公布的统计数据显示,Windows 依然是世界上排名第一的操作系统,而且未来将很难被打破 ...

  2. 基于Jquery实现省份、城市、区县三级联动

    前端感觉写的比较少,也是为了练手,下午没事用来写了这个三级联动,也是第一次写这东西. 据我了解,城市信息可以选择存在数据库或者直接写在前端,为了省事,我直接写在前端,下面是我的代码: <!DOC ...

  3. Beta发布

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2408] 视频展示 链接[https://www.cnblogs.com/erc ...

  4. 第33课 main函数与命令行参数

    main函数的概念: 测试程序: 以上四种定义main函数的方法都是正确的. main函数的本质: 操作系统是希望main函数的有返回值的,这样可以知道main函数的退出状态. 如果程序时异常退出的, ...

  5. 管道通信Pipe

    通信原理: 在内存中开辟管道空间,生成管道操作对象,多个进程使用“同一个”管道对象进程操作即可实现通信 函数方法: fd1,fd2 = Pipe(duplex = True) 功能: 创建管道 参数: ...

  6. WPF 中的 NameScope

    我们在 WPF 中使用绑定时可以使用 ElementName=Foo 这样的写法,并且还能够真的在运行时找到这个名称对应的对象,是因为 WPF 中提供了名称范围概念. 实现 INameScope 接口 ...

  7. HDU5033 Building(单调栈)

    题意是说在水平轴上有很多建筑物(没有宽度),知道每个建筑物的位置与高度.有m个查询,每次查询位置x所能看到的天空的角度. 方法是将建筑与查询一起排序,从左往右计算一遍,如果是建筑物,则比较最后两个(当 ...

  8. test20181020 B君的第二题

    题意 分析 考场70分 一看就是裸的kmp,直接打上去. #include<cstdlib> #include<cstdio> #include<cmath> #i ...

  9. jquery插件与扩展一

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

  10. INET_ADDRSTRLEN 和 INET6_ADDRSTRLEN 长度

    在<netinet/in.h>中有这两个宏的定义 #define INET_ADDRSTRLEN 16 #define INET6_ADDRSTRLEN 46 INET_ADDRSTRLE ...