常用排序算法专题—归并排序

Java常用排序算法 阅读详情

归并排序

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

  • 基本思路

 

  •  
  • 分而治之

在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

我们可以看到上图中,待排序数组为{4,8,2,7,1,6,3,5},我们先将它们分解成{4,8,2,7}和{1,6,3,5}两部分,将这两部分继续分解为{4,8}、{2,7}和{1,6}、{3、5};以此类推,分解的过程完成。接着我们将4,8,2,7,1,6,3,5两两排序合并,变成{4,8}、{2,7}、{1,6}、{3、5},紧接着继续将以上四部分两两排序合并,变成{2,4,7,8}和{1,3,5,6},最后再将这两部分排序合并,排序完成。

  • 归并操作
  • 归并操作需要将两个已经有序的子序列合并成一个有序序列,我们选择图中的{2,4,7,8}和{1,3,5,6}为例,它是怎么合并成一个有序数列呢?
  • 我们先重新申请一个能容纳两个数组归并的空间(命名temp的数组),两个哨兵指针 i 和 j 分别指向两个数组的开头;我们对比两个指针所指向数据的大小,将小的数据移向temp数组,指向该数据的指针向后移动。

 

  •  

 

  •  

注:我们发现 j 指针已经指向结尾,那么把前一个数组的剩余数据按顺序移到temp数组。

 

此时两个已经有序的子序列合并成了一个有序序列。

JAVA 代码

 
package DataStructure; public class MergeSort { public static void sort(int[] arr, int low, int high, int[] temp) { if (low < high) { int mid = (low + high) / 2; sort(arr, low, mid, temp); sort(arr, mid + 1, high, temp); merge(arr, low, mid, high, temp); // 对两个子数组进行合并操作 } } private static void merge(int[] arr, int low, int mid, int high, int[] temp) { int tempPoint = 0; // temp数组指针 int i = low; // i指针 int j = mid + 1; // j指针 while (i <= mid && j <= high) if (arr[i] <= arr[j]) temp[tempPoint++] = arr[i++]; else temp[tempPoint++] = arr[j++]; while (i <= mid) temp[tempPoint++] = arr[i++]; // 左边剩余的填充至temp数组中 while (j <= high) temp[tempPoint++] = arr[j++]; // 右边剩余的填充至temp数组中 int t = 0; while (low <= high) // 返回至原数组 arr[low++] = temp[t++]; } public static void main(String[] args) { int[] arr = { 4, 8, 2, 7, 1, 6, 3, 5 }; int[] temp = new int[arr.length]; sort(arr, 0, arr.length - 1, temp); for (int n : arr) System.out.print(n + " "); } } 
  • 时间复杂度

归并排序是稳定排序,它也是一种十分高效的排序,上图中可看出,每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为O(logn)。总平均时间复杂度为O(nlogn)。而且,归并排序的最好、最坏、平均时间复杂度均为O(nlogn)。

喜欢的点点关注,点点赞。

对Java技术,架构技术感兴趣的同学,欢迎加QQ群585550789,一起学习,相互讨论。

群内已经有小伙伴将知识体系整理好(源码,笔记,PPT,学习视频),欢迎加群领取。

从零开始:手把手教你用VOACAP软件预测短波最佳工作频率(OWF) 本文详细介绍了如何使用VOACAP软件预测短波通信的最佳工作频率(OWF),涵盖软件安装、参数配置、电离层模型设置及结果解读。通过实战案例和优化技巧,帮助用户掌握短波传播特性,提升通信效率。特别适合业余无线电爱好者和专业通信人员参考。 阅读详情

相关推荐

从.har文件到Postman集合:一键转换的完整教程(附避坑指南)

本文详细介绍了如何将.har文件高效转换为Postman集合的完整教程,涵盖基础操作到高级技巧,包括认证信息处理、环境变量提取等痛点问题的解决方案。通过抓包工具记录的.har文件,开发者可以快速生成Postman集合,提升API调试与测试效率,特别适合前后端分离开发模式下的团队协作。

weixin_26795617的博客 384

10大排序算法之四:归并排序【稳定的】,复杂度中,系统常用归并排序

1)归并排序的核心思想,先把arr的L--R上分为2部分,然后再归并这俩有序数组为一个整体有序数组2)自然用master公式计算得知,归并排序的时间复杂度为o(nlog(n))

weixin_46838716的博客 3243

DIY必备:如何用N-MOS管搭建低成本DC有刷电机驱动电路(附原理图+避坑指南)

本文详细介绍了如何使用N-MOS管搭建低成本、高可靠性的DC有刷电机驱动电路。针对DIY爱好者,从核心原理、电路设计、元件选型到焊接调试,提供了完整的实战指南,并重点解析了续流二极管选型、栅极驱动设计等关键避坑要点,帮助读者成功驱动电机并确保电路稳定运行。

delta的博客 775

常见排序算法之归并排序详解JAVA实现

1.归并排序简介 _ 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法, 该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序, 再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并排序是一种稳定的排序方法。_ 简而言之: == 1. 把数组拆分 2. 然后把数组合...

qq_43507104的博客 798

强化学习之课程学习法

课程学习是一种有计划的学习方法,模拟人类学习的过程。它通过设置逐步增加难度的任务序列,让学习系统从简单的任务开始,逐渐过渡到复杂任务。这一方法可以显著提高训练效率,避免智能体一开始就面临过于复杂的任务,从而导致学习过程困难。逐步难度增加:从简单的任务开始,逐步增加任务的难度,直到智能体能够解决最复杂的任务。动态调整:根据智能体的学习进展,动态调整任务的难度,保证学习的过程始终处于一个适当的挑战性范围。

m0_64087341的博客 2695

CarSim转向控制对比指南:开环扭矩控制vs转角控制(附Simulink连接示例)

本文深入对比了CarSim中车轮转角控制与开环扭矩控制的核心原理与适用场景。开环扭矩控制能激活完整的转向系统动力学,更适用于EPS控制策略开发与驾驶员在环仿真等对真实性要求高的场景。文章提供了详细的Simulink接口配置步骤与连接示例,为车辆动力学仿真工程师提供了清晰的决策与实操指南。

weixin_29199873的博客 478

常见的三种排序算法(堆排、快排、归并排序)的比较总结

这两天看了一下常见的三种排序算法:堆排序、快速排序、gong

1万+

2025美赛C题奥运奖牌榜模型(附代码+全保姆教程)Models for Olympic Medal Tables

伟大教练”效应的测量方法定义奖牌变化率:−−​如果变化率显著为正,且超出历史平均增长率,则认为存在“伟大教练”效应。使用统计方法(如t检验)验证教练到来是否带来显著性差异。

博客 6371

冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较

掌握好常用的排序算法,在实际的项目开发中可以节省很多的时间。每一种排序算法在执行的效率上是存在差别的,这些微小的时间差,也许在平常的联系当中感觉不到,但是涉及到数据量比较大或者是在资源比较紧张的系统中就显得尤其的重要,比如嵌入式系统。下面简要介绍三种常用的排序算法以及他们的执行效率的比较。        冒泡排序:最优为O(n),最坏为O(n^2),平均O(n^2)        思路:将相邻

Invoker's Tower 9933

「UG/NX」多功能dll集成一个dll的三种方法

C++多功能集成一个dll的三种方法。

何曾参静谧的博客 1390

linux内核学习(八)---摄像头框架移植(上)

本章来开始进行摄像头的移植,同时回顾一下V4L2的整个框架

文艺小少年的博客 113

常用排序算法之归并排序

归并排序,核心为数组分解和合并的过程。将数组逐渐分解,直到两个两个元素为一组,待小组排序完成后,再将两个两个小组合并为一个一个有序的大组……最后得到排序后的原始数组。         代码实现:         public class MergingSort { /** * MethodName:main * Description:常用排序算法之归并排序 * @para

Sunny_Shu123的博客 335

【华为OD机试】2024年真题C卷(python)-API集群负载统计

【华为OD机试】-API集群负载统计-【华为OD机试】-API集群负载统计:某个产品的 restful API 集合部署在服务器集群的多个节点上,近期对客户端访问日志进行了采集,需要统计各个API的访问频次,根据热点信息在服务器节点之间做负载均衡,现在需要实现热点信息统计查询功能。 restful API 是由多个层级构成,层级之间使用/连接,如 A/B/C/D 这个地址,A属于第一级,B属于第二级,C属于第三级,D属于第四级。 现在负载均衡模块需要知道给定层级上某个名字出现的频次,未出现过用0

u014481728的博客 1495

二分归并排序算法_常用排序算法专题—归并排序

归并排序归并排序(Merge Sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。基本思路分而治之在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成...

weixin_39648297的博客 121

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

1177: 按要求排序(指针专题)_常用排序算法专题—归并排序

归并排序归并排序(Merge Sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。基本思路分而治之在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成...

weixin_42364852的博客 106

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

排序算法之归并排序

归并排序和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。

9288

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

经典排序算法之归并排序详解

大家好,这篇博客来记录一下归并排序算法的详细实现原理以及归并排序的模板。

晴空๓ 2813

【算法专题】链表排序算法总结

链表排序算法总结 概述 问题描述:给定一个链表,请将这个链表升序排列。 节点定义: struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; 1 链表插入排序 题目描述:Leetcode 0147 链表进行插入排序 分析 因为头结点可能会改变,因此需要设置一个虚拟头结点dummy。 我们从前向后遍历整个链表,假设当前考察节点为p,我们需要从

weixin_42638946的博客 8929

【排序算法】—— 归并排序

合并的具体思路:定义三个指针分别指向第一、二个序列和临时序列的第一个元素,然后对指针指向的元素进行比较,将较小的那一个元素添加到临时序列中,随即将对应的指针往后移动一位,直到指向第一个序列或第二个序列的指针走完,因为两个序列都是有序的,所以此时将没有走完的指针所指向的位置的后面所有元素都放入临时序列中即可。因此,我们的问题就得以解决了,第一步就是。来判断此时序列中元素的个数和该子序列在整个序列中的具体位置,然后不断将其从中间进行分割,直到只有一个元素,此时退出递归,回到上一层,进行合并即可。

2302_80243065的博客 2041

【十大排序算法】归并排序

归并排序,如同秋日落叶,分散而细碎, 然而风吹叶动,自然而有序, 彼此相遇,轻轻合拢, 最终成就,秩序之谧。

DC1020的博客 1175

python排序算法——归并排序(附代码)

(附详细代码)归并排序的平均时间复杂度是O(nlgn),最好情况下的时间复杂度是O(nlgn),最坏情况下的时间复杂度也是O(nlgn)。它的空间复杂度是O(1)。另外,归并排序还是一个稳定的排序算法。

阿极的博客 3795

排序算法之归并排序分析

归并排序 排序思想: 归并排序使用的就是分治思想,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。 这种将大问题分解成小问题的思想与递归很像,分治和递归的区别就是:分治是一种解决问题的处理思想,递归是一种编程技巧 如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。 归并排序...

qq_42006733的博客 1938

排序算法:归并排序,golang实现

在实际场景中,选择合适的排序算法对于提高程序的效率和性能至关重要,本节课主要讲解"归并排序"的适用场景及代码实现。

幸享龙枫的博客 1694

【排序算法】 ——— 归并排序总结

文章目录

Lebron 858

排序算法专题-归并排序

  归并排序是一种十分经典的冲破O(n2)时间复杂度的排序算法,该算法是基于分治的思想,讲解算法原理之前,先看一下下面一张图。 图片来源:【算法】排序算法之归并排序   上图就是归并算法的一个简单示例。该算法就是每次将数组递归拆解为两部分,直到所有部分包含元素为1,之后递归的将各个部分进行归并。 具体的算法步骤如下: 1:递归拆解数组,直到每个区块包含元素数量为1 2:归并数组,直到归并后的数组长度等于原数组长度 3: 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 4:设定两

lemon_tttea的博客 1165
上一篇: 锱铢必较:在spring boot中使用神器防止CSRF攻击
下一篇: VC删除文件夹操作代码
java1856905
博客等级 码龄8年 100粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值