热门标签 | 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;
}


推荐阅读
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • 本文总结了Java程序设计第一周的学习内容,涵盖语言基础、编译解释过程及基本数据类型等核心知识点。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 堆是一种常见的数据结构,广泛应用于计算机科学领域。它通常表示为一棵完全二叉树,并可通过数组实现。堆的主要特性是每个节点的值与其父节点的值之间存在特定的关系,这使得堆在优先队列和排序算法中非常有用。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 本文介绍了如何在多线程环境中实现异步任务的事务控制,确保任务执行的一致性和可靠性。通过使用计数器和异常标记字段,系统能够准确判断所有异步线程的执行结果,并根据结果决定是否回滚或提交事务。 ... [详细]
  • Linux系统中Java程序Too Many Open Files问题的深入解析与解决方案
    本文详细分析了在Linux环境下运行的Java应用程序中可能出现的“Too many open files”异常现象,探讨其成因及解决方法。该问题通常出现在高并发文件访问或大量网络连接场景下,对系统性能和稳定性有较大影响。 ... [详细]
  • 本文详细介绍了Grand Central Dispatch (GCD) 的核心概念和使用方法,探讨了任务队列、同步与异步执行以及常见的死锁问题。通过具体示例和代码片段,帮助开发者更好地理解和应用GCD进行多线程开发。 ... [详细]
  • 机器学习核心概念与技术
    本文系统梳理了机器学习的关键知识点,涵盖模型评估、正则化、线性模型、支持向量机、决策树及集成学习等内容,并深入探讨了各算法的原理和应用场景。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文详细探讨了如何通过分析单个或多个线程在瓶颈情况下的表现,来了解处理器资源的消耗。无论是单进程还是多进程环境,监控关键指标如线程数量、占用时间及调度优先级等,有助于揭示潜在的性能问题。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
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社区 版权所有