▶ 使用 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. type使用细则

    CREATE OR REPLACE TYPE ADDRESS_TYPE   --创建类型 ADDRESS_TYPE AS OBJECT(ZIP VARCHAR2(6),PROVINCE VARCHAR ...

  2. localStorage(本地存储)使用总结

    1.https://www.cnblogs.com/st-leslie/p/5617130.html (localStorage使用总结)

  3. IEnumerable<T> 接口和GetEnumerator 详解

    IEnumerable<T> 接口 .NET Framework 4.6 and 4.5   公开枚举数,该枚举数支持在指定类型的集合上进行简单迭代. 若要浏览此类型的.NET Frame ...

  4. java日志体系的思考(转)

    Java 日志缓存机制的实现 Java 日志管理最佳实践 混乱的 Java 日志体系 log日志远程统一记录 浅谈后端日志系统 Java异常处理和接口约定 用SLF4j/Logback打印日志-1 用 ...

  5. mysql插入中文数据报错 java.sql.SQLException: Incorrect string value: '\xE5\x90\x88\xE8\xAE\xA1' for column

    1.我们创建数据库的时候没有更改数据库的字符集为utf8. 在mysql工具中,右击数据库,->"改变数据库",->选择“基字符集”为utf-8; 2,数据库中表的字符 ...

  6. Xcode6中手动添加Precompile Prefix Header

    Xcode5中创建一个工程的时候,系统会自动创建一个以以工程名为名字的pch(Precompile Prefix Header)文件,开发的过程中可以将广泛使用的头文件以及宏包含在该文件下,编译器就会 ...

  7. js设计模式中发布与订阅实现观察者模式例子

    <script> var pubsub = {}; (function(q) { var topics = {}; subuid = -1; q.publish = function(to ...

  8. iOS开发之 - 键盘处理神器 IQKeyboardManager

    平常在开发中,用到输入框的地方不胜其数,当输入框位于屏幕底部时,弹起的键盘很可能覆盖输入框,导致用户看不到输入结果,体验较差...... IQKeyboardManager 可以很简单快捷的解决键盘遮 ...

  9. 《转》深入理解Activity启动流程(三)–Activity启动的详细流程2

    本文原创作者:Cloud Chou. 出处:本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--Activity启 ...

  10. Http协议——Header说明

    下图是我用IE的开发人员工具截取的一个Http Request请求的Header. 下图是我用IE的开发人员工具截取的一个Http Response的Header. header常用指令 header ...