完整代码:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <cmath>
#include <mpi.h> using namespace std; struct Pair {
int left;
int right;
}; const int MAX_PROCESS = 128;
const int NUM = 8000;
const int MAX = 1000000;
const int MIN = 0; int arr[NUM];
int temp[NUM]; Pair pairs[MAX_PROCESS]; int counter = -1; void swap(int A[], int i, int j) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
} int findpivot(int i, int j) {
return (i + j) / 2;
} int partition(int A[], int l, int r, int pivot) {
do {
while (A[++l] < pivot);
while ((r != 0 && (A[--r] > pivot)));
swap(A, l, r);
} while (l < r);
swap(A, l, r);
return l;
} void quicksort(int A[], int i, int j, int currentdepth, int targetdepth) {
if (currentdepth == targetdepth) {
int rank = ++counter;
pairs[rank].left = i;
pairs[rank].right = j;
cout << pairs[rank].left << " and " << pairs[rank].right << " : rank " << rank << endl;
return;
}
if (j <= i) return;
int pivotindex = findpivot(i, j);
swap(A, pivotindex, j);
int k = partition(A, i - 1, j, A[j]);
swap(A, k, j);
quicksort(A, i, k - 1, currentdepth + 1, targetdepth);
quicksort(A, k + 1, j, currentdepth + 1, targetdepth);
} void quicksort(int A[], int i, int j) {
if (j <= i) return;
int pivotindex = findpivot(i, j);
swap(A, pivotindex, j);
int k = partition(A, i - 1, j, A[j]);
swap(A, k, j);
quicksort(A, i, k - 1);
quicksort(A, k + 1, j);
} int main(int argc, char* argv[]) {
MPI_Init(&argc, &argv);
int RANK, SIZE, targetdepth, left, right, REAL_SIZE; MPI_Comm_rank(MPI_COMM_WORLD, &RANK);
MPI_Comm_size(MPI_COMM_WORLD, &SIZE);
REAL_SIZE = SIZE;
if (RANK == 0) {
cout << "Quick sort start..." << endl;
cout << "Generate random data... "; memset(arr, 0, NUM * sizeof(arr[0]));
srand(time(NULL));
for (int i = 0; i < NUM; i++) {
arr[i] = MIN + rand() % (MAX - MIN);
}
cout << "Done." << endl;
targetdepth = log2(SIZE);
cout << "Rank: " << RANK << endl;
cout << "Sorting... ";
quicksort(arr, 0, NUM - 1, 0, targetdepth);
REAL_SIZE = counter + 1;
for (int i = 1; i < SIZE; i++) {
int left = pairs[i].left;
int right = pairs[i].right;
MPI_Send(&REAL_SIZE, 1, MPI_INT, i, 99, MPI_COMM_WORLD);
MPI_Send(&left, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
MPI_Send(&right, 1, MPI_INT, i, 1, MPI_COMM_WORLD);
MPI_Send(&arr, NUM, MPI_INT, i, 2, MPI_COMM_WORLD);
} left = pairs[0].left;
right = pairs[0].right;
quicksort(arr, left, right);
cout << "Process " << RANK <<" done."<< endl;
} for (int process = 1; process < REAL_SIZE; process++) {
if (RANK == process) {
MPI_Status status;
MPI_Recv(&REAL_SIZE, 1, MPI_INT, 0, 99, MPI_COMM_WORLD, &status);
MPI_Recv(&left, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
MPI_Recv(&right, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);
MPI_Recv(&arr, NUM, MPI_INT, 0, 2, MPI_COMM_WORLD, &status);
if (process < REAL_SIZE) {
quicksort(arr, left, right);
MPI_Send(&arr, NUM, MPI_INT, 0, 0, MPI_COMM_WORLD);
cout << "Process " << RANK << " done." << endl;
}
}
} if (RANK == 0) {
for (int i = 1; i < REAL_SIZE; i++) {
//cout << "Master is ready to receive data from process " << i << endl;
MPI_Status status;
MPI_Recv(&temp, NUM, MPI_INT, i, 0, MPI_COMM_WORLD, &status);
for (int j = pairs[i].left; j <= pairs[i].right; j++) {
arr[j] = temp[j];
}
//cout << "Master has combined data from process " << i << endl;
}
cout << "Done." << endl;
cout << "Result:" << endl;
int counter = 1;
int row = 20; for (int i = 0; i < NUM; i++, counter++) {
cout << arr[i] << " ";
if (arr[i] < arr[max(i - 1, 0)]) {
cerr << "Invalid! " << arr[i] << " > "<< arr[max(i - 1, 0)] <<" i is "<< i << endl;
}
if (counter % row == 0) cout << endl;
}
}
MPI_Finalize(); }

运行截图:

基于 MPI 的快速排序算法的实现的更多相关文章

  1. 基于c++的ostu算法的实现

    图像二值化算法是图像处理的基础.一般来说,二值化算法可以分为两个类别:全局二值化和局部二值化.全局二值化是指通过某种算法找到一个全局的阈值T,对图像中坐标为(x,y)的像素值做如下处理: Ostu就是 ...

  2. 快速排序算法的实现 && 随机生成区间里的数 && O(n)找第k小 && O(nlogk)找前k大

    思路:固定一个数,把这个数放到合法的位置,然后左边的数都是比它小,右边的数都是比它大 固定权值选的是第一个数,或者一个随机数 因为固定的是左端点,所以一开始需要在右端点开始,找一个小于权值的数,从左端 ...

  3. Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。

    Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...

  4. 基于思岚A1激光雷达+OpenGL+VS2017的Ramer-Douglas-Peucker算法的实现

    时隔两年 又借到了之前的那个激光雷达,最老版本的思岚A1,甚至不支持新的固件,并且转接板也不见了,看了下淘宝店卖¥80,但是官方提供了一个基于STM32的实现方式,于是我估摸着这个转接板只是一个普通的 ...

  5. Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...

  6. SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)

    在SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现) 一文中,我曾经说过优化后的ExpBlur比BoxBlur还要快,那个时候我比较的BoxBlur ...

  7. C++基础代码--20余种数据结构和算法的实现

    C++基础代码--20余种数据结构和算法的实现 过年了,闲来无事,翻阅起以前写的代码,无意间找到了大学时写的一套C++工具集,主要是关于数据结构和算法.以及语言层面的工具类.过去好几年了,现在几乎已经 ...

  8. 排序算法的实现之Javascript(常用)

    排序算法的实现之Javascript 话不多说,直接代码. 1.冒泡排序 1.依次比较相邻的两个数,如果前一个比后一个大,则交换两者的位置,否则位置不变 2.按照第一步的方法重复操作前length-1 ...

  9. Alink漫谈(六) : TF-IDF算法的实现

    Alink漫谈(六) : TF-IDF算法的实现 目录 Alink漫谈(六) : TF-IDF算法的实现 0x00 摘要 0x01 TF-IDF 1.1 原理 1.2 计算方法 0x02 Alink示 ...

随机推荐

  1. 《图解TCP/IP》笔记

    OSI参考模型 协议分层 为什么需要分层? 简化网络协议. 每一层只需要衔接上下层的服务. 利于模块化开发. 解耦. 分层的问题 过分模块化.提高数据处理的开销. OSI参考模型 作用及意义 将复杂的 ...

  2. 模块urllib requests json xml configparser 学习笔记

    发起http请求 获取返回值 返回值是字符串 第三方模块安装 pip install requests 返回值格式 xml  html  jaon json 功能  loads   字符串>&g ...

  3. 移动端和PC端区分

    1.移动端包括:浏览器.ios/android.qq端.微信端 九度数据官网源码.修改,要跳转的链接即可. function browserRedirect() { var sUserAgent = ...

  4. 新手关于C++ cin 的返回值

    cin是C++的标准输入流,其本身是一个对象,并不存在返回值的概念. 不过经常会有类似于 while(cin>>a) 的调用,这里并不是cin的返回值,应该关注">> ...

  5. 数据结构,哈希表hash设计实验

    数据结构实验,hash表 采用链地址法处理hash冲突 代码全部自己写,转载请留本文连接, 附上代码 #include<stdlib.h> #include<stdio.h> ...

  6. 关于大视频video播放的问题以及解决方案(m3u8的播放)

    在HTML5里,提供了<video>标签,可以直接播放视频,video的使用很简单: <video width="320" height="240&qu ...

  7. 图的遍历BFS

    图的遍历BFS 广度优先遍历 深度优先遍历 可以进行标记 树的广度优先遍历,我们用了辅助的队列 bool visited[MAX_VERTEX_NUM] //访问标记数组 //广度优先遍历 void ...

  8. selenium IDE使用-1

    selenium 硒 Mercury汞,外国人喜欢取这化学的名字 一.selenium概述 1.selenium是开源免费的,针对web应用程序功能自动化测试的工作. 2.做功能自动化的原因:回归测试 ...

  9. Numpy的学习4-array的合并

    import numpy as np A = np.array([1, 1, 1]) B = np.array([2, 2, 2]) print(np.vstack((A, B))) # vertic ...

  10. tep用户手册帮你从unittest过渡到pytest

    unittest和pytest是Python的2个强大的测试框架,经常用来做UI自动化或接口自动化.unittest是PyCharm的默认集成工具,也是我们大多数人入门自动化的首选框架.pytest提 ...