【归并排序】| 详解归并排序 力扣912

news2025/2/28 3:18:01

🎗️ 主页:小夜时雨
🎗️专栏:归并排序
🎗️如何活着,是我找寻的方向

优雅

目录

  • 1. 题目解析
  • 2. 代码

1. 题目解析

题目链接: https://leetcode.cn/problems/sort-an-array/

在这里插入图片描述

我们上道题讲过归并排序的核心代码,建议先看一下这道题:合并两个有序数组 https://leetcode.cn/problems/merge-sorted-array/description/

归并排序的核心代码区间就是合并两个有序数组, 所以还是十分重要的, 接下来我们再来分析一下合并这个过程:

  • 首先这两个是非递减的整数数组,那么很自然的一个想法就是从头开始遍历两个数组,谁小取出来排队即可。
  • 取出来排队这个操作我们巨化为创建一个辅助数组,将数组中二者比较小的放入到这个辅助数组中, 直到遍历结束。
  • 最后再将辅助数组拷贝到原始数组中即可。整体的思路还是比较符合实际我们进行比较排序的情况的。

接下来我们来说一下归并排序的实现过程

归并排序具体实现过程:

  1. 首先我们先确定一个 key,把数组分为左右两个区间进行排序,此处通常都是选为中间区域,key = (left + right)/ 2 。
  2. 左右区间在进行排序,怎么排序:同样是在左区间找一个key,使得左区间又分为左右两个区间,同理右区间也是。我们发现都是先进行划分区间,一直划分。
  3. 划分直到左右区间内只有一个元素或者区间不存在,假设只有一个元素,那么不用排序天然就是有序的,此时要做的就是归并排序的核心操作:把左右区间的两个元素继续有序的合并,合并成一个有序的区间向上返回。
  4. 也就是说我们一直划分到划分不了区间为止,然后开始合并变成有序向上返回,越往上返回此时的数组也就是越有序的,直到最后的两个左右有序区间进行合并,那么最后这个区间就是有序的了,也就是排好序了。

看下面的分析图可能会更容易理解:

在这里插入图片描述

  • 也就是说我们想先排整体有序,以左区间为例:得先让左区间进行有序,让左区间有序就得让左区间的左右区间进行有序,然后合并,
  • 就这样一直划分下去,直到划分不了区间。我们发现这个过程其实有点像是二叉树的后序遍历,左右区间有序之后(类比先遍历左右子树),合并之后整体才会有序(遍历根节点)。
  • 接下来,后面会写到快排,快排则是相反的一个过程,类似于二叉树的前序遍历,后面很快会写到。

2. 代码

看下面的代码对照着上面的流程解析可能会更加的清楚。

   int[] tmp;  // 用一个全局的辅助数组
   public int[] sortArray(int[] nums) {
      int n = nums.length;
      tmp = new int[n];
      mergeSort(0, n - 1, nums);
      return nums;
   }

   private void mergeSort(int left, int right, int[] nums) {
       // 区间内只有一个元素或者元素不存在, 那么直接返回没有排序的必要
       if(left >= right) return;

       // 归并排序的主逻辑过程
       // 1. 找到一个中间位置
       int mid = (left + right) / 2;
       // [left, mid] [mid + 1, right] 划分为两个区间

       // 2. 先进行左右两边的分割,排个序。相信这两个函数能完成左右区间的排序
       // (递归不用太关注于具体的展开过程)
       mergeSort(left, mid, nums);
       mergeSort(mid + 1, right, nums);
       
       // 3. 两边排好序之后, 合并有序数组。(核心操作)
       // cur1 遍历 [left, mid] 这个区间
       // cur2 遍历 [mid + 1, right] 这个区间
       // i 遍历 tmp 辅助数组
       int cur1 = left, cur2 = mid + 1, i = 0;
       // while(cur1 <= left && cur2 <= right) {
       while(cur1 <= mid && cur2 <= right) {
           tmp[i++] = nums[cur1] <= nums[cur2] ? nums[cur1++] : nums[cur2++];
       }
       
       // 4.处理cur1 或者 cur2 还没有遍历完的数组
       while(cur1 <= mid) tmp[i++] = nums[cur1++];
       while(cur2 <= right) tmp[i++] = nums[cur2++];
       
       // 5. 把辅助数组中的数组拷贝到原数组中
       // j 遍历的是原数组, nums中的 【left, right】 这个区间
       for (int j = left; j <= right; j++) {
           // tmp 要从 0 开始遍历
           nums[j] = tmp[j - left];
       }
   } 

用到了一个全局的辅助数组,而不是每次进入递归都要重新new一下,这样写起来会方便一点。

🎗️🎗️🎗️ 好啦,到这里有关本题的分享就没了,如果感觉做的还不错的话可以点个赞,关注一下,你的支持就是我继续下去的动力,我们下期再见,拜了个拜~ ☆*: .。. o(≧▽≦)o .。.:*☆

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea 创建properties文件,解决乱码

设置properties文件编码 点击file->Settings File Encodings->设置utf-8 重新创建.properties文件才生效

MySQL的自增 ID 用完了,怎么办?

MySQL 自增 ID 一般用的数据类型是 INT 或 BIGINT&#xff0c;正常情况下这两种类型可以满足大多数应用的需求。 当然也有不正常的情况&#xff0c;当达到其最大值时&#xff0c;尝试插入新的记录会导致错误&#xff0c;错误信息类似于&#xff1a; ERROR 167 (22003): Out o…

算法期末整理(正在更新中)

一 算法概述 算法的概念 通俗地讲&#xff0c;算法是指解决问题的一种方法或一个过程。更严格地讲&#xff0c;算法是由若干条指令组成的有穷序列。 算法的性质 1.输入&#xff1a;有0个或多个由外部提供的量作为算法的输入。 2.输出&#xff1a;算法产生至少一个量作为输出。…

【机器学习300问】126、词嵌入(Word Embedding)是什么意思?

人类的文字&#xff0c;作为一种高度抽象化的符号系统&#xff0c;承载着丰富而复杂的信息。为了让电脑也能像人类一样理解并处理这些文字&#xff0c;科学家们不断探索各种方法&#xff0c;以期将人类的语言转化为计算机能够理解的格式。 一、One-Hot编码的不足 在自然语言处…

每月策略会议

周一顾问策略会议&#xff0c;对于企业辅导而言&#xff0c;领导力是可以培训的&#xff0c;而决策力不是靠培训就能达成&#xff0c;是需要反复训练和反思。从最为关心的一个状况出发&#xff0c;去行动才会有结果&#xff0c;有了结果反思我们的假设是否有盲区是否有误才有可…

LVGL开发教程-Grid(网格布局)

系列文章目录 知不足而奋进 望远山而前行 目录 系列文章目录 文章目录 前言 1. 常用方法 2. 代码实现 总结 前言 网格布局&#xff08;Grid Layout&#xff09;是一种强大的布局方式&#xff0c;它允许将项目按照行和列的二维表格方式进行排列。LVGL&#xff08;Little…

分布式之日志系统平台ELK

ELK解决了什么问题 我们开发完成后发布到线上的项目出现问题时(中小型公司),我们可能需要获取服务器中的日志文件进行定位分析问题。但在规模较大或者更加复杂的分布式场景下就显得力不从心。因此急需通过集中化的日志管理,将所有服务器上的日志进行收集汇总。所以ELK应运而生…

Android Glide, first start based on loadThumbnail, Kotlin(二)

Android Glide, first start based on loadThumbnail, Kotlin&#xff08;二&#xff09; Android Glide, first start based on loadThumbnail, Kotlin&#xff08;一&#xff09;中有个小问题&#xff0c;通过loadThumbnail()采集到的缩略图真的就是整张图片的完整缩略图&…

NET Core C# 中的Action委托:语法、用法和示例_2024-06-19

Action委托是一个内置的泛型委托类型。此委托使您的程序更具可读性和效率&#xff0c;因为您无需定义自定义委托&#xff0c;如以下示例所示。 它在 System 命名空间下定义。它没有输出参数&#xff0c;输入参数最少为 1 个&#xff0c;最多为 16 个。 Action委托通常用于具有…

高压电阻器支持牙科 X 射线成像的准确性

为了捕获患者牙齿和颌骨的足够图像&#xff0c;牙医依靠锥形束计算机断层扫描 &#xff08;CBCT&#xff09; 系统的先进 3D 成像。CBCT系统的输出对于准确诊断口腔健康问题和随后的治疗计划至关重要。为了确保这些图像的可靠性&#xff0c;CBCT系统制造商利用了Exxelia Ohmcra…

【bug】配置SpringCloudAlibaba AI的maven依赖问题

问题描述 尝鲜alibaba的ai模块&#xff0c;maven依赖一直报找不到包&#xff0c;报错如下 Unresolved dependency: org.springframework.ai:spring-ai-core:jar:0.8.1原因分析&#xff1a; 由于是按照官方文档配置的&#xff0c;所以检查了很多遍maven配置&#xff0c;加上去…

给电脑bios主板设置密码

增强安全性&#xff1a;防止未经授权的人员更改 BIOS 中的重要设置&#xff0c;如启动顺序、硬件配置等。这有助于保护计算机系统的稳定性和数据的安全性。防止恶意篡改&#xff1a;阻止可能的攻击者或恶意软件通过修改 BIOS 设置来破坏系统或获取敏感信息。数据保护&#xff1…

阿里云 debian10.3 sudo apt-get updat 报错的解决方案

阿里云全新的debian10.3(buster)镜像&#xff0c;却无法正常执行 sudo apt-get update。主要报错信息如下&#xff1a; Err:6 http://mirrors.cloud.aliyuncs.com/debian buster-backports Release404 Not Found [IP: 100.100.2.148 80] Err:3 http://mirrors.cloud.aliyuncs…

【JavaEE 进阶(五)】SpringBoot日志

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多进阶知识 目录 1.前言2.日志使用2.1打印日志2.2 门面模式(外观模式)2.3SLF4J框架2.4日志格式说明 3.Sl…

MySQL----配置主从复制

环境 master(CtenOS7)&#xff1a;192.168.200.131 ----ifconfig查看->ens33->inet slave(win10)&#xff1a;192.168.250.52 ----ipconfig查看->无线局域网适配器 WLAN:-> IPv4 地址 保证两个环境中MySQL版本一致 网络互通 win&#xff1a;ping 192.168.200.13…

NL2SQL进阶系列(1):DB-GPT-Hub、SQLcoder、Text2SQL开源应用实践详解

1. MindSQL(库) MindSQL 是一个 Python RAG&#xff08;检索增强生成&#xff09;库&#xff0c;旨在仅使用几行代码来简化用户与其数据库之间的交互。 MindSQL 与 PostgreSQL、MySQL、SQLite 等知名数据库无缝集成&#xff0c;还通过扩展核心类&#xff0c;将其功能扩展到 Sn…

【五子棋】C语言教程

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

webhook-k8s API和apimachinery版本高于Client-go

1. 问题 使用go mod tidy 存在丢弃的版本 go: downloading github.com/josharian/intern v1.0.0 go: finding module for package k8s.io/api/flowcontrol/v1alpha1 go: simple-webhook/types importsk8s.io/client-go/rest tested byk8s.io/client-go/rest.test importsk8s.…

大数据-数据分析初步学习,待补充

参考视频&#xff1a;数据分析只需3小时从入门到进阶&#xff08;up亲身实践&#xff09;_哔哩哔哩_bilibili 数据指标&#xff1a; 对当前业务有参考价值的统计数据 分类&#xff1a;用户数据&#xff0c;业务数据&#xff0c;行为数据 用户数据 存量&#xff1a; DAU&#…

基于Vue3.0 Node.js 的 大文件切片上传、秒传、断点续传实现方案梳理

✨&#x1f4bb; 在处理大文件上传时&#xff0c;切片上传是提高效率与用户体验的关键技术之一。下面将详细介绍如何在前端利用Vue框架与Node.js后端配合&#xff0c;实现这一功能。 &#x1f446;&#x1f3fb;大体流程 &#x1f446;&#x1f3fb;一、文件切片上传 通过文件…