▶ 使用 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. 雷林鹏分享:JSP 简介

    JSP 简介 什么是Java Server Pages? JSP全称Java Server Pages,是一种动态网页开发技术.它使用JSP标签在HTML网页中插入Java代码.标签通常以<%开 ...

  2. linux shell执行原理

    shell简介 Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行. 运行背景 a 一个基本的linux系统结构 b.由上图可以看出,shel ...

  3. [linux]文件系统损坏,linux启动时 checking filesystems fail

    先敲root password进入maintenance状态,然后fsck -y /dev/mapper/vg_wwwdata-lv_root等干净了以后,再exit就行了. ------------ ...

  4. 本人遇到的spring事务之UnexpectedRollbackException异常解决笔记

    本人最近在使用spring事务管理的过程中遇到如下异常,导致服务端抛出500给前端,让搞前端的哥们抱怨我心里着实不爽,前前后后折腾了近半个小时才得于解决,今天就做个笔记,以免日后又犯这个错误.好了,错 ...

  5. FZU 2169 shadow spfa

    题目链接:shadow 好佩服自己耶~~~好厉害~~~ 麻麻再也不用担心我的spfa 和 邻接表技能了~~~ spfa 记录最短路径. #include <stdio.h> #includ ...

  6. Oracle管道函数(Pipelined Table Function)实现的实例

    1. 简单的例子(返回单列的表) 1>创建一个表类型 create or replace type t_table is table of number; 2>创建函数返回上面定义的类型 ...

  7. jQuery的无new创建方法

    一般我们去写一个框架,会采用什么样的设计呢?比如设计一个jQuery框架,一般我们会创建一个函数对象 function jQuery(params){ //构造函数 }jQuery.prototype ...

  8. 在Windows中配置Rsync同步

    Rsync是一款不错的文件免费同步软件,可以镜像保存整个目录树和文件系统,同时保持原来文件的权限.时间.软硬链接.第一次同步时 rsync 会复制全部内容,下次只传输修改过的文件部分.传输数据过程中可 ...

  9. BZOJ2140: 稳定婚姻(tarjan解决稳定婚姻问题)

    2140: 稳定婚姻 Time Limit: 2 Sec  Memory Limit: 259 MBSubmit: 1321  Solved: 652[Submit][Status][Discuss] ...

  10. 离散数学:用C语言来判断集合存在的二元关系

    用C语言来判断是否满足自反,反自反,非自反,对称,反对称,非对称和传递性 也不知道写的对不对.没有大量验证,但是随便找的一些关系测试的没毛病,如果错了,欢迎各位大佬留言 #include<bit ...