#include <stdio.h>
#include<stdafx.h>
#include<iostream>
#include <stdlib.h>
#include <time.h>
#include "omp.h"
using namespace std;
//int count=0;
void swap(int &a, int &b)//
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
void quicksort(int *A,int l, int u)
{
int i,m,k;
if (l >= u) return;
m = l;
for (i = l+1; i <= u; i++)
if (A[i] < A[l])/*无论是选第一个元素作为pivot还是最后一个作为pivot,假如我们想得到的是从小到大的序列。那么最坏的输入
//情况就是从大到小的;假设我们想得到从大到小的序列,那个最坏的输入情况就是从小到大的序列*/
swap(A[++m], A[i]);
swap(A[l], A[m]);
quicksort(A,l, m-1);
quicksort(A,m+1, u);
}
void main(int argc, char *argv)
{
omp_set_num_threads(2);//----------------设置线程数为2,由于是双核的CPU
int k=0,i=0;
int m=0,n=0;
double cost=0;
int len=10000;
int short_len=len/2;
int B[10000],C[10000],D[5000],E[5000];//--------将B[]分为两个小的数组,并行的对他们调用高速排序算法
#pragma omp parallel default(none) shared(B,C,len) private(i)//---这个for循环是并行的
{
int j=50000;
#pragma omp for
for(i=0;i<len;i++)
{
B[i]=j--;
C[i]=j--;
//初始化B[],C[]数组
}
}
clock_t begin = clock();//----------------计时開始点
#pragma omp parallel default(none) shared(B,D,E,short_len) private(i)//---这个for循环是并行的
{
#pragma omp for
for(i=0;i<short_len;i++)//---这个for循环是并行的
{
D[i]=B[i];//将B[]的前5000个数放入D[]
E[i]=B[i+5000];//将B[]的后5000个数放入E[]
}
}
#pragma omp parallel default(none) shared(E,D,short_len) //private(i)------高速排序的并行region
{
#pragma omp parallel sections
{
#pragma omp section
quicksort(D, 0, short_len-1);//对D[]排序
#pragma omp section
quicksort(E, 0, short_len-1);//对E[]排序
}
}
for(;k<len;k++)//----------将D[]和E[]进行归并排序放入B[]里面
{
if(m<short_len && n<short_len)
{
if(D[n]<=E[m])
{
B[k] = D[n];
n++;
}
else
{
B[k]=E[m];
m++;
}
}
if(m==short_len || n==short_len)
{
if(m==short_len)
B[k]=E[m];
else
B[k]=D[n-1];
k+=1;
break;
}
}
if(/*m==short_len &&*/ n<short_len)
{
int tem=short_len-n;
for(int p=0;p<tem;p++)
{
B[k]=D[n];
n++;
k++;
}
}
else if(/*n==short_len &&*/ m<short_len)
{
int tem=short_len-m;
for(int q=0;q<tem;q++)
{
B[k]=E[m];
m++;
k++;
}
}//----------------------------归并算法结束
clock_t end = clock();//----------------计时结束点
cost = (double)(end - begin);
cout<<"并行时间"<<cost<<endl;
//串行開始
begin=clock();
quicksort(C, 0, len-1);
end = clock();
cost = (double)(end - begin);
cout<<"串行时间"<<cost<<endl;
system("pause");
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hyaXN0cHJpbmNlMDA3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

OpenMp高速分拣的更多相关文章

  1. 六白话经典算法系列 高速分拣 高速GET

     高速分拣,因为相同的排序效率O(N*logN)几个订购流程更高效,因此,经常使用,再加上高速分拣思想----分而治之的方法也是非常有用的,如此多的软件公司书面采访.它包含了腾讯,微软等知名IT企业宁 ...

  2. 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)

    写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...

  3. 算法---高速分拣(quick sort)

    在前面的排序中所描述的算法.最快的排序算法是归并排序,但是有一个缺陷合并排序排序过程的需求O(N)额外的空间.本文介绍了高速的排序算法到位排序算法,所需的复杂性的额外空间O(1). 算法介绍:高速排序 ...

  4. C面试题

    1.sizeof()和strlen()使用? 答案: 1.从功能定义,strlen功能,要查找字符串的长度,sizeof功能是用来寻找指定的变量或变量类型的存储器占用 尺寸: 2.sizeof是运算符 ...

  5. docker4dotnet #4 使用Azure云存储构建高速 Docker registry

    使用Docker来构建应用程序最常见的操作就是 docker run 或者 docker pull了,但是由于众所周知的原因,在国内想要高速稳定的获取docker hub上面的资源并不是件容易的事情, ...

  6. 应用OpenMP的一个简单的设计模式

    小喵的唠叨话:最近很久没写博客了,一是因为之前写的LSoftmax后馈一直没有成功,所以在等作者的源码.二是最近没什么想写的东西.前两天,在预处理图片的时候,发现处理200w张图片,跑了一晚上也才处理 ...

  7. IT这一行,如可高速下载国外资源之迅雷设置免费SSH代理下载国外资源

    本文转自SUN'S BLOG 原文地址:IT这一行,如可高速下载国外资源之迅雷 我们这些做IT这一行的人,经常,下载一些国外的一些资源,可是让人蛋碎的是,往往这些资源下载都慢的像蜗牛,真的让人无法忍受 ...

  8. openmp 的使用

    http://blog.csdn.net/gengshenghong/article/details/7003110 说明:这部分内容比较基础,主要是分析几个容易混淆的OpenMP函数,加以理解. ( ...

  9. SNMP高速扫描器braa

    SNMP高速扫描器braa   SNMP(Simple Network Monitoring Protocol,简单网络管理协议)是网络设备管理标准协议.为了便于设备管理,现在联入网络的智能设备都支持 ...

随机推荐

  1. C 文件直接包含

    C 文件直接包含 有一部分代码很大,在很多函数中重复,可以直接写在另外的一个文件中,引用时直接包含.co.cpp两个函数都 包含c1.cxx. 点击(此处)折叠或打开 ////// co.cpp #i ...

  2. 【Python】Python 基础知识

    数字和表达式 >>> 2+3 5 >>> 1.0/2.0 0.5 >>> 1.0//2.0 # // 0.0 >>> 1%2 # ...

  3. Jetty:配置安全

    用${jetty.home}和${jetty.base}配置安全 Jetty 9.1中:  1)${jetty.home}是jetty公布(二进制)的文件夹路径:  2)${jetty.base}是用 ...

  4. navicat for mysql 如何将表ID排序重1开始?

    如果是自增字段,删除数据,他是根据原来的继续往后排的 1.你可以删除这个字段,重新建立个自增字段就可以了 2.好像也可以重新设置排序起始 alter table table_name AUTO_INC ...

  5. PAIP: Paradigms of Artificial Intelligence Programming

    PAIP: Paradigms of Artificial Intelligence Programming PAIP: Paradigms of Artificial Intelligence Pr ...

  6. “HTTP 错误 401.1 - 未授权:登录失败” iis配置和权限问题

    今天,将项目发布到IIS服务器上,出现此问题,本地IIS访问正常. 登录失败说明根本登录不了,谈何访问网页,所以要从两方面下手,一.账户:二.账户权限: 一.设置你网站属性的时候,目录安全性-匿名访问 ...

  7. timesten升级

    ttIsql "DSN=ttwind;UID=cacheuser;PWD=cacheuser;OraclePWD=cacheuser;" --1.查看当前版本号 Command&g ...

  8. tar.gz文件命名和压缩解压方法

    tar.gz文件命名 tar这是文件打成一个包,无压缩; gz同gzip标记的包.tar文件压缩; 所以它成为一个.tar.gz档 压缩 # tar cvfz backup.tar.gz /xxx/ ...

  9. NET Core 中的依赖注入

    NET Core 中的依赖注入 [共7篇] 一.控制反转(IoC) ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制, ...

  10. codeforces 598A Tricky Sum

    题目链接:http://codeforces.com/contest/598/problem/A 题目分类:大数 题意:1到n 如果是2的次方则减去这个数,否则就加上这个数,求最后的结果是多少 题目分 ...