当前位置:网站首页>并行化快速排序设想
并行化快速排序设想
2022-07-30 12:13:00 【君梦如烟Brian】
并行化快速排序
对于一般的快速排序,总是使用分治法将任务划分成两个子任务。那么,子任务之间是相互对立的。不仅如此,它不像归并排序的分治之后还需要汇总的过程。
因此,可以相当然,将一趟快排与任务联系起来。
规定:QuickSort(arr, l, r) 为一趟快排。
由于任务之间两两独立,每趟快排完成之后(即确认了一个数的下标后),我们可以将子任务并行执行,化为两个段范围的子任务,对于个数比较少的任务,我们可以使用插入算法直接处理。
因为是计算密集型的程序,为了最大化性能,我们直接设计线程池重用线程。
void QuickSort(arr, beg, end){
if(end - beg <= 5) {
inserted_sort(arr, beg, end);
return;
}
mid = beg + (end - beg)/2;
pool.addTask(QuickSort(arr, beg, mid));
pool.addTask(QuickSort(arr, mid, end));
}
其实,跟递归版本的快排没什么区别
关于同步方面,只要使用一个定制版本的CountDownLatch,主线程wait, 每投递一个任务就计数自增,在函数结束的时刻再down,防止过早的down导致提前唤醒主线程。
void QuickSort(arr, beg, end){
if(end - beg <= 5) {
inserted_sort(arr, beg, end);
return;
}
mid = beg + (end - beg)/2;
pool.addTask(QuickSort(arr, beg, mid));
pool.addTask(QuickSort(arr, mid, end));
latch.inc(2); // count = count + 2;
latch.down(); // count = count - 1;
}
主线程的部分
threadpool pool;
CountDownLatch latch;
latch.inc(1);
pool.addTask(QuickSort(arr, beg, end))
latch.wait();
关于并行化归并排序
对于归并排序的并行化,与快排也差不多。只不过需要在结束两个子任务时候,进行同步。性能方面,应该没有快速排序的快。因为,任务线程之间同步,导致我们不能很好地重用线程。当然,我们可以用类似于协程的手段去解决这种阻塞问题。
边栏推荐
- Matlab基础(2)——向量与多项式
- 【MySQL系列】-B+树索引和HASH索引有什么区别
- 我又造了个轮子:GrpcGateway
- TensorFlow custom training function
- English line break
- 使用百度EasyDL实现明厨亮灶厨师帽识别
- Scheduling of combined electric-heating system based on multi-objective two-stage stochastic programming method
- 什么是私有云?您应该知道的 6 个优势
- [BJDCTF2020]Cookie is so stable-1|SSTI注入
- 奇异值分解(SVD)原理与在降维中的应用(附带例题讲解)(纯理论)
猜你喜欢

京东二面痛遭中间件虐杀,30天学透这套中间件小册,挺进阿里

SCM engineers written questions induction summary

什么是驱动程序签名,驱动程序如何获取数字签名?

Homework 7.29 correlation function directory and file attributes related functions
![[BJDCTF2020]Cookie is so stable-1|SSTI注入](/img/48/34955bbe3460ef09a5b8213c7cc161.png)
[BJDCTF2020]Cookie is so stable-1|SSTI注入

AlphaFold预测了几乎所有已知蛋白质!涵盖100万物种2.14亿结构,数据集开放免费用...

超图iServer rest服务之最佳路径分析

反转链表-迭代反转法

unity对象池(学习)

【Kaggle:UW-Madison GI Tract Image Segmentation】肠胃分割比赛:赛后复盘+数据再理解
随机推荐
TensorFlow custom training function
基于柔性人机接口的人机协调运动控制方法
IO/multiplexing (select/poll/epoll)
什么是私有云?您应该知道的 6 个优势
Farmers on the assembly line: I grow vegetables in a factory
概率论的学习整理2:如何对随机实验的对象:“事件” 进行计数呢? 四种计数方法,不只是排列组合
Rust 从入门到精通02-安装
MySQL【多表查询】
概率论的学习整理1: 集合和事件
微信视频号视频如何下载提取?视频号直播回放如何下载?方法很简单!
Breaking the principle and introducing SQL, what does MongoDB want to do???
Rust from entry to proficient 02-installation
Reverse linked list - recursive inversion method
nodeJs--fs模块
干货分享:小技巧大用处之Bean管理类工厂多种实现方式
Zhou Hongyi: Microsoft copied the 360 security model and became the largest security company in the United States
最基础01/完全背包
关于File文件的相关知识
11 年膨胀 575 倍,微信为何从“小而美”变成了“大而肥”?
saltstack学习1入门基础