#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. OCA读书笔记(3) - 使用DBCA创建Oracle数据库

    Objectives: •Create a database by using the Database Configuration Assistant (DBCA) •Generate databa ...

  2. C++ 载入dll

    1.新建一个项目生成dll 首先我们新建一个项目生成一个Dynamic Library(动态链接库) dll 里面非常简单,只有一个add方法.等下我们就要在其他项目里尝试载入这个dll,调用里面的这 ...

  3. WKE——Webkit精简的纯C接口的浏览器

    以前不知道有这个东西 https://github.com/cexer/wke http://blog.csdn.net/weolar/article/details/50383491 http:// ...

  4. 在Window和Linux下使用Zthread库

    ZThread库是一个开源的跨平台高级面向对象的线性和sycnchronization 库,以运行POSIX 和Win32 系统中的C++程序. ZThread库的主页:http://zthread. ...

  5. Codeforces 474B Worms 二分法(水

    主题链接:http://codeforces.com/contest/474/problem/B #include <iostream> #include <cmath> #i ...

  6. easy_install MySQL-python

    python - Why can't easy_install find MySQLdb? - Stack Overflow easy_install MySQL-python

  7. 优酷m3u8视频源地址获取失败

    昨天和今天上午,优酷站点视频全然没有办法播放,可是我是获取的优酷视频的视频原地址,所以app还是能够正常播放而且有下载功能.今天下午開始,优酷视频网页能够訪问了,可是视频原地址却不在了.我全部的app ...

  8. python - ImportError: No module named http.cookies error when installing cherrypy 3.2 - Stack Overflow

    python - ImportError: No module named http.cookies error when installing cherrypy 3.2 - Stack Overfl ...

  9. cocos2d-x项目101次相遇: Scenes , Director, Layers, Sprites

    cocos2d-x 101次相遇 / 文件夹  1   安装和环境搭建 -xcode  2   Scenes , Director, Layers, Sprites 3   建立图片菜单  4   在 ...

  10. hdu3062(two-sat)

    传送门:Party 题意:有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时出现在 ...