热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

多线程实现排序

使用了3个排序方法,以及时间对比。正常的归并排序。stl里面的sort方法使用多线程分段使用stl里面的sort方法排序后,再使用归并排序。线程开了总共就开了16个。#includ

使用了3个排序方法,以及时间对比。



  1. 正常的归并排序。

  2. stl里面的sort方法

  3. 使用多线程分段使用stl里面的sort方法排序后,再使用归并排序。

线程开了总共就开了16个。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
using ll = long long;
const int mod = 1e9 + 7;;
template
auto rbt(T func, args ... param) {
auto st = clock();
func(param...);
return clock() - st;
}
void merge_sort(int * const beg,int *const end) {
const int len = end - beg;
if (len<= 1) {
return;
}
merge_sort(beg, beg + len / 2);
merge_sort(beg+len/2, end);
int * const tmp = new int[len];
const int *lend = beg + len / 2;
int *p1 = beg, *p2 = beg + len / 2;
int *p = tmp;
while (p1 != lend && p2 != end) {
if (*p1 <*p2) {
*p++ = *p1++;
}
else {
*p++ = *p2++;
}
}
while (p1 != lend)*p++ = *p1++;
while (p2 != end)*p++ = *p2++;
p = tmp;
p1 = beg;
while (p1 != end) *p1++ = *p++;

delete []tmp;
return;
}
void std_sort(int *a,int *b) {
std::sort(a, b);
}
vector veth;
void t_div(int * const beg, int *const end,int deep) {
const int len = end - beg;
if (len <= 1) {
return;
}
if (deep == 4) {
veth.emplace_back(thread(std_sort, beg, beg + len / 2));
veth.emplace_back(thread(std_sort, beg + len / 2, end));
return;
}
else {
t_div(beg, beg + len / 2, deep + 1);
t_div(beg + len / 2, end, deep + 1);
}
return;
}
void t_merge(int * const beg, int *const end,int deep) {
const int len = end - beg;
if (len <= 1|| deep==4) {
return;
}

t_merge(beg, beg + len / 2,deep+1);
t_merge(beg + len / 2, end,deep+1);

int * const tmp = new int[len];
const int *lend = beg + len / 2;
int *p1 = beg, *p2 = beg + len / 2;
int *p = tmp;
while (p1 != lend && p2 != end) {
if (*p1 <*p2) {
*p++ = *p1++;
}
else {
*p++ = *p2++;
}
}
while (p1 != lend)*p++ = *p1++;
while (p2 != end)*p++ = *p2++;
p = tmp;
p1 = beg;
while (p1 != end) *p1++ = *p++;
delete[]tmp;
return;
}
void thread_sort(int *a, int *b) {
int len = b - a;
if (len >= 1e4) {
t_div(a, b, 0);
for (auto it = veth.begin(); it != veth.end();++it) {
it->join();
}
t_merge(a, b, 0);
}
else {
std::sort(a, b);
}
}
int s[10000000];
int main() {
random_device e;
uniform_int_distribution d(0, 128);
for (auto i = begin(s); i != end(s); ++i) {
*i = d(e);
}
printf("merge_sort time:%d\n",rbt(merge_sort,begin(s), end(s)));
for (auto i = begin(s); i != end(s); ++i) {
*i = d(e);
}
printf("std_sort time:%d\n", rbt(std_sort, begin(s), end(s)) );
for (auto i = begin(s); i != end(s); ++i) {
*i = d(e);
}
printf("thread_sort time :%d\n", rbt(thread_sort, begin(s), end(s)));
return 0;
}


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文总结了Linux下多线程执行shell脚本的4种方法,包括切换到工作目录执行、使用绝对路径执行、直接使用bash或sh执行。同时介绍了为什么需要加上"./"来执行脚本的原因。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Java虚拟机中的垃圾收集器,包括年轻代收集器Serial收集器、ParNew收集器、Parallel Scavenge收集器,以及老年代收集器Serial Old收集器、Parallel Old收集器和CMS收集器。对每种收集器的算法和特点进行了详细解析,希望对读者有参考价值。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • Spring Batch中多线程配置及实现例子
    本文介绍了在Spring Batch中开启多线程的配置方法,包括设置线程数目和使用线程池。通过一个示例演示了如何实现多线程从数据库读取数据并输出。同时提到了在多线程情况下需要考虑Reader的线程安全问题,并提供了解决方法。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
author-avatar
飞飞鱼531
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有