0

0

使用多线程在C++中实现归并排序

王林

王林

发布时间:2023-08-30 15:33:12

|

1860人浏览过

|

来源于tutorialspoint

转载

使用多线程在c++中实现归并排序

我们得到一个未排序的整数数组。任务是使用通过多线程实现的合并排序技术对数组进行排序

合并排序

合并排序是一种基于分而治之技术的排序技术,我们将将数组分成相等的两半,然后以排序的方式将它们组合起来。

实现归并排序的算法是

  • 检查是否有一个元素

  • 否则,将数据递归地分成两半,直到无法再分为止。

    立即学习C++免费学习笔记(深入)”;

  • 最后,按排序顺序将较小的列表合并为新列表。

多线程

在操作系统中,线程是负责执行部分任务的轻量级进程。线程共享公共资源来并发执行任务。

多线程是多任务处理的一种实现,我们可以在单个处理器上运行多个线程来并发执行任务。它将单个应用程序中的特定操作细分为单独的线程。每个线程都可以并行运行。

例如:

In −int arr[] = {3, 2, 1, 10, 8, 5, 7, 9, 4}

输出−排序后的数组为:1, 2, 3, 4, 5, 7, 8, 9, 10

解释-我们得到一个带有整数值的未排序数组。现在我们将使用多线程合并排序对数组进行排序。

In −int arr[] = {5, 3, 1, 45, 32, 21, 50} p>

输出−排序后的数组为:1, 3, 5, 21, 32, 45, 50

解释−我们给出具有整数值的未排序数组。现在我们将使用多线程合并排序对数组进行排序。

下面程序中使用的方法如下 -

  • 我们将开始通过使用 C++ STL 中的 rand() 方法生成随机数。

  • 创建 pthread_t 类型的数组,即 P_TH[thread_size]。

    小邮包 包月订购包年程序
    小邮包 包月订购包年程序

    小邮包-包月订购包年服务网,该程序由好买卖商城开发,程序采用PHP+MYSQL架设,程序商业模式为目前最为火爆的包月订制包年服务模式,这种包年订购在国外网站已经热火很多年了,并且已经发展到一定规模,像英国的男士用品网站BlackSocks,一年的袜子购买量更是达到了1000万双。功能:1、实现多产品上线,2、不用注册也可以直接下单购买,3、集成目前主流支付接口,4、下单发货均有邮件提醒。

    下载
  • 开始从 i 到 0 的 FOR 循环,直到 i 小于线程的大小。在循环内部,调用 pthread_create(&P_TH[i], NULL, Sorting_Threading, (void*)NULL) 方法来创建具有给定数组值的线程。

  • 将函数作为组合数组调用(0、(大小 / 2 - 1) / 2、大小 / 2 - 1)、combine_array(大小 / 2、大小/2 + (大小-1-大小/2)/2、大小 - 1) 和 merge_array(0 , (size - 1)/2, size - 1)

  • 打印存储在整数类型 arr[] 中的排序数组。

  • 函数内部void* Sorting_Threading(void* arg)

    • 声明一个变量为set_val到temp_val++,首先要set_val * (size / 4 ),end 为 (set_val + 1) * (size / 4) - 1,mid_val 为first + (end - first) / 2

    • 检查 IF first 小于 end then调用Sorting_Threading(first, mid_val)、Sorting_Threading(mid_val + 1, end)和combine_array(first, mid_val, end);

  • 里面function void Sorting_Threading(int first, int end)

    • 将变量声明为 mid_val to first + (end - first) / 2

    • 检查 IF 首先小于 end,然后调用 Sorting_Threading(first, mid_val)、Sorting_Threading(mid_val + 1, end) 和 merge_array(first, mid_val, end)

  • 函数内部 void merge_array(int first, int mid_val, int end)

    • 将变量声明为 int* start 到new int[mid_val - first + 1]、int* last 到 new int[end - mid_val]、temp_1 到 mid_val - first + 1、temp_2 到 end - mid_val、i、j、k 到first。

      li>
    • 开始从 i 到 0 的 FOR 循环,直到 i 小于 temp_1。在循环内,将 start[i] 设置为 arr[i + first]。

    • 开始从 i 到 0 的 FOR 循环,直到 i 小于 temp_2。在循环内部,将last[i]设置为arr[i + mid_val + 1]

    • 将i设置为j为0。当i小于temp_1并且j小于时开始循环比 temp_2。在此期间,检查 IF start[i] 是否小于 last[j],然后将 arr[k++] 设置为 start[i++]。否则,设置 arr[k++] = last[j++]

    • 当 i 小于 temp_1 时开始,然后设置 arr[k++] = start[i++]。当 j 小于 temp_2 时开始,然后将 arr[k++] 设置为 last[j++]

示例

#include <iostream>
#include <pthread.h>
#include <time.h>
#define size 20
#define thread_size 4
using namespace std;
int arr[size];
int temp_val = 0;
void combine_array(int first, int mid_val, int end){
   int* start = new int[mid_val - first + 1];
   int* last = new int[end - mid_val];
   int temp_1 = mid_val - first + 1;
   int temp_2 = end - mid_val;
   int i, j;
   int k = first;
   for(i = 0; i < temp_1; i++){
      start[i] = arr[i + first];
   }
   for (i = 0; i < temp_2; i++){
      last[i] = arr[i + mid_val + 1];
   }
   i = j = 0;
   while(i < temp_1 && j < temp_2){
      if(start[i] <= last[j]){
         arr[k++] = start[i++];
      }
      else{
         arr[k++] = last[j++];
      }
   }
   while (i < temp_1){
      arr[k++] = start[i++];
   }
   while (j < temp_2){
      arr[k++] = last[j++];
   }
}
void Sorting_Threading(int first, int end){
   int mid_val = first + (end - first) / 2;
   if(first < end){
      Sorting_Threading(first, mid_val);
      Sorting_Threading(mid_val + 1, end);
      combine_array(first, mid_val, end);
   }
}
void* Sorting_Threading(void* arg){
   int set_val = temp_val++;
   int first = set_val * (size / 4);
   int end = (set_val + 1) * (size / 4) - 1;
   int mid_val = first + (end - first) / 2;
   if (first < end){
      Sorting_Threading(first, mid_val);
      Sorting_Threading(mid_val + 1, end);
      combine_array(first, mid_val, end);
   }
}
int main(){
   for(int i = 0; i < size; i++){
      arr[i] = rand() % 100;
   }
   pthread_t P_TH[thread_size];
   for(int i = 0; i < thread_size; i++){
      pthread_create(&P_TH[i], NULL, Sorting_Threading, (void*)NULL);
   }
   for(int i = 0; i < 4; i++){
      pthread_join(P_TH[i], NULL);
   }
   combine_array(0, (size / 2 - 1) / 2, size / 2 - 1);
   combine_array(size / 2, size/2 + (size-1-size/2)/2, size - 1);
   combine_array(0, (size - 1)/2, size - 1);
   cout<<"Merge Sort using Multi-threading: ";
   for (int i = 0; i < size; i++){
      cout << arr[i] << " ";
   }
   return 0;
}

输出

如果我们运行上面的代码,它将生成以下输出

Merge Sort using Multi-threading: 15 21 26 26 27 35 36 40 49 59 62 63 72 77 83 86 86 90 92 93

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

458

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

169

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

246

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

34

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 21.1万人学习

Java 教程
Java 教程

共578课时 | 81万人学习

HTML教程
HTML教程

共500课时 | 6.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号