【排序4】探秘归并排序:提高程序效率的必备技巧

😊归并排序

  • 🎊1、基本思想
  • 🎊2、代码示例
  • 🎊3、非递归实现
  • 🎊4、归并排序的性能分析
  • 🎊5、归并排序的优缺点
  • 🎊6、归并排序的应用场景
  • 🎊7、总结

🎊1、基本思想

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并

🔍归并排序的实现可以分为两个主要步骤:分解合并
分解:将待排序序列平均分成两个子序列,递归地对子序列进行分解,直到子序列的长度为1(此时子序列已经有序)。
合并:将两个有序子序列合并成一个新的有序序列。合并操作从两个子序列的起始位置开始,比较两个子序列的当前元素,将较小的元素放入新序列中,并将该元素所在子序列的指针向后移动一位。重复此过程,直到一个子序列的所有元素都被放入新序列中。然后将另一个子序列的剩余元素依次放入新序列中。

合并如图
在这里插入图片描述

🎊2、代码示例

public static void mergeSort(int[] array) {mergeFunc(array,0,array.length-1);
}private static void mergeFunc(int[] array,int left,int right) {if(left >= right) {return;}int mid = left + ((right-left) >> 1);mergeFunc(array,left,mid);mergeFunc(array,mid+1,right);//左边分解完,右边分解完,开始合并merge(array,left,mid,right);
}private static void merge(int[] array,int left,int mid,int right) {int s1 = left;int e1 = mid;int s2 = mid+1;int e2 = right;int[] tmpArr = new int[right-left+1];int k = 0;//1.保证两个表 都有数据while (s1 <= e1 && s2 <= e2) {if(array[s1] <= array[s2]) {tmpArr[k++] = array[s1++];}else {tmpArr[k++] = array[s2++];}}//2. 看哪个数组 还有数据 拷贝回去while (s1 <= e1) {tmpArr[k++] = array[s1++];}while (s2 <= e2) {tmpArr[k++] = array[s2++];}//3.拷贝到源数组for (int i = 0; i < k; i++) {}
}

🎊3、非递归实现

public static void mergeSortNor(int[] array) {int  gap = 1;//最外层循环 控制组数while (gap < array.length) {//每一组进行排序for (int i = 0; i < array.length; i = i+2*gap) {int left = i;int mid = left + gap-1;if(mid >= array.length) {mid = array.length-1;}int right = mid+gap;if(right >= array.length) {right = array.length-1;}merge(array,left,mid,right);}gap *= 2;}
}

🎊4、归并排序的性能分析

归并排序的时间复杂度为O(nlogn),其中n为待排序序列的长度。这是因为归并排序每次都将序列分成两半,需要递归logn次。每次合并操作需要遍历所有元素,因此总的时间复杂度为O(nlogn)。归并排序的空间复杂度为O(n),因为合并操作需要额外的空间来存储新序列。

🎊5、归并排序的优缺点

👻归并排序的优点包括:
1、稳定性:归并排序是一种稳定的排序算法,即相同元素的相对顺序在排序过程中不会改变。
2、时间复杂度:归并排序的时间复杂度为O(nlogn),在处理大量数据时具有较高的性能

🎉归并排序的缺点包括:
1、空间复杂度:归并排序的空间复杂度为O(n),需要额外的空间来存储新序列。在内存受限的情况下,这可能会成为一个问题。

🎊6、归并排序的应用场景

归并排序在许多领域都有广泛的应用,例如:

1、外部排序:在处理大量数据且内存受限的情况下,归并排序是一种有效的外部排序算法。它可以将数据分成多个小块,分别排序后再合并。
2、数据库系统:数据库系统在进行数据查询、排序和索引时,经常使用归并排序来提高性能。
3、大数据处理:在处理大规模数据集时,归并排序可以与其他算法(如MapReduce)结合使用,实现高效的数据处理和分析。

🎊7、总结

🥳

  1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(N)
  4. 稳定性:稳定

🎉OK!今天的分享就到这里了,后面还会分享更多算法,敬请关注喔!!!✌️
在这里插入图片描述
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2jk117zkpgaoo

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

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

相关文章

Android开发学习-Activity

启停活动页面 1、启动和停止 startActivity(new Intent(原页面.this,目标页面.this)); startActivity(new Intent(this,ActFinishActivity.class)) 从当前页面回到上一个页面&#xff0c;相当于关闭当前页面&#xff0c;返回代码如下&#xff1a; finish(); 2、生命周期 …

【王道数据结构】【chapter线性表】【P44t16】

设有一个长度为n&#xff08;n为偶数&#xff09;的不带头结点的单链表且结点值都大于0&#xff0c;设计算法求这个单链表的最大的孪生和。孪生和的定义为一个结点值与其孪生结点值的和&#xff0c;对于第i个结点&#xff08;从0开始&#xff09;&#xff0c;其孪生结点为第n-i…

十分钟搭建本地Linux开发运行环境

十分钟搭建本地开运行环境 linux环境请参考&#xff1a;5分钟搭建本地linux开发环境 环境&#xff1a;宝塔、Jdk、Mysql、Redis 1、宝塔&#xff1a; 官网地址&#xff1a;宝塔官网 yum install -y wget && wget -O install.sh https://download.bt.cn/install/in…

安科瑞宿舍安全用电监测:科技保障,安全无忧

在当今社会&#xff0c;电力已成为我们日常生活中不可或缺的一部分。然而&#xff0c;不正确的用电方式或管理不善可能会引发火灾等安全事故&#xff0c;给学生带来生命财产威胁。为了解决这一问题&#xff0c;安科瑞宿舍安全用电监测系统应运而生&#xff0c;为学生的用电安全…

力扣1312. 让字符串成为回文串的最少插入次数

动态规划 思路&#xff1a; 通过插入字符构造回文串&#xff0c;要想插入次数最少&#xff0c;可以将字符串 s 的逆序 s 进行比较找出最长公共子序列&#xff1b;可以先分析&#xff0c;字符串 s 通过插入得到回文串 ps&#xff0c;其中间的字符应该不会变化&#xff1a; 若 s…

仅使用 Python 创建的 Web 应用程序(前端版本)第09章_购物车

在本章中,我们将实现购物车页面。 完成后的图像如下。 创建过程与之前相同,如下。 No分类内容1Model创建继承BaseDataModel的数据类Cart、CartItem2Service创建一个 CartAPIClient3Page定义PageId并创建继承自BasePage的页面类4Application将页面 ID 和页面类对添加到 Multi…

ZYNQ AC7020C的“点LED”实验

一、创建 Vivado 工程 1、启动 Vivado 2、在 Vivado 开发环境里点击“Create New Project”&#xff0c;创建一个新的工程 3、弹出一个建立新工程的向导&#xff0c;点击“Next” 4、在弹出的对话框中输入工程名和工程存放的目录。需要注意工程路径“Project location”不能有…

IS-IS:07 ISIS缺省路由

IS-IS 有两种缺省路由&#xff0c;第一种缺省路由是由 level-1 路由器在特定条件下自动产生的&#xff0c;它的下一跳是离它最近的 &#xff08;cost 最小&#xff09;level-1-2路由器。第二种缺省路由是 IS-IS 路由器上使用 default-route-advertise 命令产生并发布的。 本次实…

智慧交通的“大脑”与“神经”:物联网与车联网双轮驱动,智慧交通加速驶入未来

目录 一、物联网&#xff1a;智慧交通的“大脑” 二、车联网&#xff1a;智慧交通的“神经” 三、物联网与车联网的协同发展 四、智慧交通的未来展望 五、物联网与车联网在智慧交通中的应用案例 六、智慧交通面临的挑战与解决方案 七、政策与法规在智慧交通发展中的作用…

Kafka-服务端-PartitionLeaderSelector、ReplicaStateMachine

PartitionLeaderSelector 通过对前面的分析可知&#xff0c;PartitionMachine将Leader副本选举、确定ISR集合的工作委托给了PartitionLeaderSelector接口实现&#xff0c;PartitionMachine可以专注于管理分区状态。这是策略模式的一种典型的应用场景。 图展示了PartitionLead…

程序员如何应对中年危机

中年危机是一个普遍存在的问题&#xff0c;不仅仅局限于程序员这个职业。不过&#xff0c;对于程序员来说&#xff0c;由于技术更新迅速&#xff0c;中年危机可能更加明显。以下是一些应对中年危机的建议&#xff1a; 持续学习新技术和工具&#xff1a;计算机技术发展迅速&…

【C语言刷题系列】交换两个变量的三种方式

文章目录 1.使用临时变量&#xff08;推荐&#xff09; 2.相加和相减的方式&#xff08;值较大时可能丢失数据&#xff09; 3.按位异或运算 本文所属专栏C语言刷题_倔强的石头106的博客-CSDN博客 两个变量值的交换是编程中最常见的问题之一&#xff0c;以下将介绍三种变量的…