【高性能计算】经典的串行排序算法和并行排序算法

news/2024/5/17 5:20:16/文章来源:https://blog.csdn.net/pdsu_Zhe/article/details/131201151

【高性能计算】经典的串行排序算法和并行排序算法

  • 问题背景
  • 需要解决的问题
  • 1、经典的排序算法
    • 1.1 经典的串行排序算法
      • 冒泡排序 (Bubble Sort)
      • 插入排序 (Insertion Sort)
      • 选择排序 (Selection Sort)
    • 1.2 经典的并行排序算法
      • 归并排序(Merge Sort)
      • 快速排序(Quick Sort)
      • 堆排序 (Heap Sort)


问题背景

        论述题: 自上世纪90年代以来,高性能计算(High Performance Computing, HPC)就备受关注。在无人驾驶、航天器的设计和制造、石油勘探、天气预报、地震资料处理以及国防安全等方面,高性能计算机都成为了一种必备工具。以自己对高性能计算应用领域的认知和所学知识,请对以下两个问题进行分析解答。


需要解决的问题

       分别列举出三个以上经典的串行排序算法和并行排序算法,对各个算法的排序思路和过程进行解释说明,并基于算法的开销分析并行排序的独特优势。


1、经典的排序算法

1.1 经典的串行排序算法

冒泡排序 (Bubble Sort)

       冒泡排序是一种简单的排序算法。它重复地遍历待排序的元素,比较相邻的两个元素,如果顺序错误则交换它们,直到没有任何一对数据需要交换位置。
排序思路: 将大的数往后冒泡。
排序过程:

1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 
2. 对每一对相邻元素作同样的工作,从开始第一队到结尾的最后一队。这步做完后,最后的元素会是最大的数; 
4. 针对所有的元素重复以上的步骤,除了最后已经选出的元素以外。 
5. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

时间复杂度: O(n^2)
空间复杂度: O(1)
优势:
       冒泡排序在排序过程中可以及时发现已经排好序的部分,从而提前终止排序。


插入排序 (Insertion Sort)

       插入排序插入排序是一种基本排序算法,它的工作原理是对于每个未排序的元素,在已排序序列中从后向前扫描,并将其插入到已排序序列中适当的位置。
排序思路: 类似打扑克牌,将牌插入到已有的牌中。
排序过程:

1. 从第一个元素开始,该元素可以认为已经被排序; 
2. 取出下一个元素,在已经排序的元素序列中从后向前扫描; 
3. 如果该元素(已排序)大于新元素,将该元素移到下一位置; 
4. 重复步骤 3,直到找到已排序的元素小于或者等于新元素的位置; 
5. 将新元素插入到该位置后; 
6. 重复步骤 2~5。 

时间复杂度: O(n^2)
空间复杂度: O(1)
优势:
       对于小规模数据集排序效率很高,因为其时间复杂度为O(n^2) ,所以插入排序适合用于处理相对少量的数据。


选择排序 (Selection Sort)

       选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
排序思路: 不断选择最小的数。
排序过程:

1. 初始状态:无序区为 R[1...n],有序区为空; 
2. 第 i 趟排序(i=1,2,3...n-1)开始时,当前有序区和无序区分别为 R[1...i-1] 和 R[i...n]。该趟排序将找到无序区中最小的元素 R[k],把它与无序区的第 1 个元素 R[i] 交换,使 R[1...i] 成为有序区,R[i+1...n] 成为无序区; 
3. 重复第 2 趟到第 n-1 趟,直到整个序列有序。 

时间复杂度: O(n^2)
空间复杂度: O(1)
优势:
       在每轮排序过程中只需要进行一次交换操作,因此在交换成本高的情况下,选择排序相对于冒泡排序和插入排序更为高效。


1.2 经典的并行排序算法

       并行排序算法与串行排序算法的主要区别在于其可以通过多个处理器同时进行数据处理,从而提高算法效率和处理速度。并行排序算法具有很好的可扩展性,适用于大规模数据量的排序操作。然而,并行排序算法的实现通常比较复杂,需要考虑诸如负载均衡、通信、同步等问题,因此需要仔细设计和优化算法。


归并排序(Merge Sort)

       归并排序也是一种常见的排序算法,它的核心思想是将待排序数组分成若干个子数组,对每个子数组进行排序,然后再将已经有序的子数组合并成一个有序的数组。
在并行归并排序中,可以采用多种方法实现并行化,如对子序列进行分割,使用不同线程进行排序和合并等。

排序思路:

1.	将待排序数组不断二分,直到每个子数组只剩下一个元素;
2.	逐层合并这些子数组,直至合并成有序数组。

排序过程:

1.	将待排序数组从中间位置分成两个子数组,对这两个子数组分别进行归并排序,直到每个子数组只有一个元素为止。
2.	对两个有序子数组进行合并,得到一个更大的有序数组。
具体来说,比较两个子数组中第一个元素的大小,将较小的元素放入新数组中,并从该数组中删除该元素,然后再次比较两个子数组的首元素,重复此过程直至其中一个子数组为空。
3.	如果还有多余的元素未加入新数组,则将它们依次添加到新数组末尾。

时间复杂度: O(nlogn)
空间复杂度: O(n)
优势:
       并行归并排序具有很好的可扩展性,可以使用多线程技术有效地利用多核处理器,提高算法的运行效率。


快速排序(Quick Sort)

       快速排序也可以并行化处理,它是一种基于分治策略的排序算法,常用的方法是选取一个枢纽元素,将数组划分为两个部分,并将小于枢纽元素的元素放入左侧部分,将大于枢纽元素的元素放入右侧部分。之后,分别对左右两侧部分递归地执行此过程,最终得到完全排序的数组。
排序思路:

1.	从待排序数组中选择一个枢轴元素;
2.	将数组分成两部分,左边部分包含小于等于枢轴元素的元素,右边部分包含大于枢轴元素的元素;
3.	对这两部分递归地执行此过程,直到所有元素都被放入正确的位置。

排序过程:

1.	选择一个枢轴元素,并根据该元素将待排序的数据分成两部分。
2.	将左半部分和右半部分分别与不同的任务相关联,然后启动多个线程来执行子问题的排序操作。
3.	在处理器之间通过通信来交换数据,以便将结果组合成一个完全排序的数组。
4.	如果需要进一步排序,则递归地重复以上步骤,直到得到完全排序的数组为止。

时间复杂度: O(nlogn)
空间复杂度: O(nlogn)
优势:
       并行快速排序可以将工作负载均匀地分配到多个处理器上,并行化执行问题解决方法,从而可以大大加速排序过程;并行快速排序可以很容易地扩展到多核处理器或分布式集群上,以适应不同规模数据的排序需求。


堆排序 (Heap Sort)

       堆排序是一种非常高效的排序算法,它的核心思想是将待排序的数组看成一个完全二叉树,并且满足父节点的值总是大于(或小于)其子节点的值。
       在并行堆排序中,可以采用分治思想,将数据集合划分成多个部分,然后并行处理每个部分。每个处理器都构建一个局部堆,并对每个堆进行排序操作,最后再通过合并操作得到有序的结果。

排序思路:

1.	将待排序数组分成若干个子数组,并将每个子数组与一个堆相关联;
2.	在每个堆中,将最大(或最小)的元素弹出,并将其放入一个临时有序数组中;
3.	使用多个线程对这些堆进行维护和操作,并将每个线程与一个堆相关联;
4.	重复上述步骤,直到所有元素都被放入临时有序数组中。

排序过程:

1.	将待排序数组划分成若干个子数组,并将每个子数组与一个堆相关联。
2.	对每个堆启动一个线程。在每个线程中,使用堆排序算法对该堆进行维护和操作,直到该堆为空。
3.	在各个线程之间通过通信来交换数据,以便将每个堆的最大(或最小)元素放入一个临时有序数组中。
4.	如果还有未处理的子数组,则递归地执行前面的步骤,直到所有子数组都被放入临时有序数组中。
5.	将已排序的子数组合并成单个有序数组,得到最终排序结果。

时间复杂度: O(nlogn)
空间复杂度: O(1)
优势:
       并行堆排序可以有效地利用多核处理器,提高算法的运行效率,并且可以在大规模数据量下保证排序效率。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_316570.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给大家分享下什么是「API接口」

作为产品经理,了解清楚接口的相关知识是非常有必要的,毕竟总不想被技术大佬认为自己时什么都不懂的需求搬运工。那就往下看下去吧 -----拿去餐馆吃饭的例子 模拟网络请求流程 厨师是后端提供API,服务员是前端请求调用API,我们是用…

记录--为什么推荐用svg而不用icon?

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 使用背景: 1.因为svg图标在任何设备下都可以高清显示,不会模糊。而icon会在显卡比较低的电脑上有显示模糊的情况 2.svg图标在页面render时 速度会比icon稍微快一点 3.实现小程序…

针对纳米片环栅晶体管中制造锗化硅(SiGe)和硅(Si)选择性蚀刻的研究

引言 栅极全能场效应晶体管(GAAFET)是一种很有前途的候选晶体管,可以用来提高FinFET性能。制造n型晶体管一般涉及到在内隔层沉积之前的高选择性SiGe:Si蚀刻步骤,我们在Si-SiGe堆叠的纳米片上产生硅压痕,并…

用ChatGPT生成测试数据

大家好,欢迎来到 Crossin的编程教室 ! 在之前的文章 用ChatGPT写一个数据采集程序 中,我们演示了如何用 ChatGPT 辅助编写代码。 除了直接让ChatGPT写代码,我们也可以让它生成一些开发中使用的测试数据。 比如在开发和测试时&…

win10中部署个人邮件服务器hMailServer

一、安装邮件服务器hMailServer hMailServer是一个免费的开源电子邮件服务器,适用于Microsoft Windows,本次实践以Windows10为例。hMailServer支持常见的电子邮件协议(IMAP、SMTP 和 POP3),并且可以轻松地与许多现有的 Web 邮件系统集成。它具有灵活的垃圾邮件保护,可以附…

国产FPGA:替代ATLERAEP4CE10E22的AG10KL144

背景 AG10K用于PIN TO PIN替代ATLERA EP4CE10E22、EP3C10E144的FPGA,其资源介绍如下: 引脚对应如下: 一般Quartus II开发方式 新建工程 FPGA使用Quartus II开发,开发的整体流程如下: 新建工程时选用Cyclone II…

Windows YOLO v8训练自己的数据集

YOLO v8 训练自己的数据集 环境准备YOLO v8创建自己的数据集1.首先准备了VOC 格式的数据集2.然后确定用于训练、测试的数据3.将VOC格式标注转为YOLO 标注4.配置数据文件 yaml 配置 YOLO v8安装和训练安装依赖包训练 环境准备 这里我的环境是Windows 环境 YOLO v8 下载链接&a…

射频电路layout总结

射频电路板设计由于在理论上还有很多不确定性,因此常被形容为一种“黑色艺术”,但这个观点只有部分正确,RF电路板设计也有许多可以遵循的准则和不应该被忽视的法则。在实际设计时,真正实用的技巧是当这些准则和法则因各种设计约束…

有什么软件可以翻译文档?这几款文本翻译软件效果不错

随着世界的全球化,我们越来越需要通过语言进行跨文化交流。但是,不同国家和地区使用的语言却存在差异,这就需要我们掌握一些文本翻译技巧。那么,你是否想过如何实现文本翻译呢?在本文中,我们将给你介绍一些…

k8s如何使用ceph rbd块存储(静态供给、存储类动态供给)

目录 前言安装ceph集群ceph集群创建rbd块存储rbd块存储不支持ReadWriteManyk8s配置rbd块存储(静态供给)创建secret创建pv创建pvck8s节点安装客户端依赖包部署pod查看pod验证是否持久化 k8s配置rbd块存储(动态供给)查看官网ceph集群…

AVL树的解析

我们在之前的学习里面已经发现了,搜索二叉树是有一些问题的。它可能会存在单边树的问题,如果你插入的值是有序的话,就会导致这个问题。 那我们肯定是要来解决一下的,如何解决呢? 》一种解决方案是AVL树,还有…

统信UOS V20 安装mysql5.7.42详细教程

1 安装包准备 到mysql官网可以看到最新的是8.0.33,想下载其他版本的点击 Looking for previous GA versions?Select Operating System: 选择如下版本的mysql 安装包 2 安装 2.1 上传文件至服务器 下载后通过远程将安装包上传至服务器,我这里将安装…

grpc 实现grpc gateway(window环境)

官网:https://grpc-ecosystem.github.io/grpc-gateway/ github:https://github.com/grpc-ecosystem/grpc-gateway grpc gateway的原理官网有介绍。总结一下就是: gRPC-Gateway帮助你同时以gRPC和RESTful风格提供你的API。grpc-gateway旨在为您…

有趣的数学 依靠想象力的微积分

1、无限分割计算圆的面积 考虑将圆切成若干等份,下图为4等份。 下图为8等份。 下图为16等份。 下图为最终想象出来的极限矩形,据此分割为无穷等份的圆拼接为一个矩形。 矩形的面积 r * C / 2。 r为半径,C为周长。 2、夹逼法计算圆周率 借助…

在没有实验数据的情况下,如何高效快速发表论文

文献计量学是指用数学和统计学的方法,定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体,注重量化的综合性知识体系。特别是,信息可视化技术手段和方法的运用,可直观的展示主题的研究发展历程、研究现状、研究…

java反射调用get/set方法

1 前言 最新工作中,遇到了通过反射调用get/set方法的地方,虽然反射的性能不是很好,但是相比较于硬编码的不易扩展,getDeclareFields可以拿到所有的成员变量,后续添加或删除成员变量时,不用修改代码&#x…

《面试1v1》Map

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 《面试1v1》 连载中… 面试官: 小伙子,又来挑战你了。听说你对Java集合中的Map也很在行? 候选人: 谢谢夸奖,Map这个接口的确非常重要且强大…

CSS基础学习--12 分组 和 嵌套 选择器

一、分组选择器 在样式表中有很多具有相同样式的元素 h1 {color:green; } h2 {color:green; } p {color:green; } 为了尽量减少代码&#xff0c;你可以使用分组选择器。 每个选择器用逗号分隔。 在下面的例子中&#xff0c;我们对以上代码使用分组选择器&#xff1a; <!DO…

延时函数:普通延时,硬件定时器延时,系统定时器延时

一、普通延时函数 此种延时是基于让MCU做一些无意义的循环操作来打发时间&#xff0c;优点是简单易懂&#xff0c;缺点是会占用MCU的处理资源且精度较低&#xff0c;主要用于程序简单、无严格时间要求的场景中。 //微秒级的延时 void delay_us(uint32_t delay_us) { volat…

MAVEN - 使用maven-dependency-plugin的应用场景是什么?

简述 maven-dependency-plugin是MAVEN的一个插件。 作用 该插件主要用于管理项目中的依赖&#xff0c;使用该插件可以方便地查看、下载、复制和解压缩依赖&#xff0c;还支持生成依赖树和依赖报告。 功能 该插件有很多可用的GOAL&#xff0c;大部分与依赖构建、依赖分析和依…