【LeetCode: 912. 排序数组 + 归并排序】

news/2025/1/11 9:32:54/

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述
在这里插入图片描述

🍔 目录

    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • 归并排序
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚩 题目链接

  • 912. 排序数组

⛲ 题目描述

给你一个整数数组 nums,请你将该数组升序排列。

你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。

示例 1:

输入:nums = [5,2,3,1]
输出:[1,2,3,5]
示例 2:

输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

提示:

1 <= nums.length <= 5 * 104
-5 * 104 <= nums[i] <= 5 * 104

🌟 求解思路&实现代码&运行结果


归并排序

🥦 求解思路
  1. sortArray(int[] arr): 这是归并排序的入口函数,它检查数组是否为空,如果是则直接返回。否则,创建一个临时数组并调用递归排序函数。
  2. mergeSort(int[] arr, int left, int right, int[] temp): 这是递归排序函数,它将数组分成两半,分别对左半部分和右半部分进行排序,然后调用merge函数将两个有序部分合并。
  3. merge(int[] arr, int left, int mid, int right, int[] temp): 这是合并函数,它将两个有序数组合并成一个有序数组,并将结果存回原数组。
  4. 有了基本的思路,接下来我们就来通过代码来实现一下。
🥦 实现代码
java">class Solution {public int[] sortArray(int[] arr) {if (arr == null || arr.length < 1) {return new int[]{}; // 如果数组为空或只有一个元素,直接返回}int[] temp = new int[arr.length]; // 创建一个临时数组用于合并mergeSort(arr, 0, arr.length - 1, temp);return arr;}// 递归排序函数private static void mergeSort(int[] arr, int left, int right, int[] temp) {if (left < right) {int mid = left + (right - left) / 2; // 找到中间点mergeSort(arr, left, mid, temp); // 对左半部分进行排序mergeSort(arr, mid + 1, right, temp); // 对右半部分进行排序merge(arr, left, mid, right, temp); // 合并两个有序部分}}// 合并两个有序数组private static void merge(int[] arr, int left, int mid, int right, int[] temp) {int i = left; // 左半部分的起始索引int j = mid + 1; // 右半部分的起始索引int k = 0; // 临时数组的起始索引// 将两个有序数组合并到临时数组中while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}// 将左半部分剩余的元素复制到临时数组中while (i <= mid) {temp[k++] = arr[i++];}// 将右半部分剩余的元素复制到临时数组中while (j <= right) {temp[k++] = arr[j++];}// 将临时数组中的元素复制回原数组k = 0;while (left <= right) {arr[left++] = temp[k++];}}}
🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述


http://www.ppmy.cn/news/1562204.html

相关文章

javaEE-网络原理-IP协议

目录 一.网络层 IP协议 IP协议头部格式 IP协议如何管理地址 1.动态分配IP地址: 2.NAT机制&#xff08;网络地址映射&#xff09; ​编辑3.IPv6 IP协议如何进行网段划分 早期的网段划分和现在还不一样&#xff1a; 一些特殊的IP地址&#xff1a; IP协议进行地址管理 二…

力扣-数组-66 加一

解析 从后往前遍历数组&#xff0c;由于首位有可能进位&#xff0c;所以拼接在原数组的首位上增加0&#xff0c;在每一位的加1后检查前一位需不需要进位 代码 class Solution { public:vector<int> plusOne(vector<int>& digits) {if(digits[0]0){digits[0]…

python关键字(保留字)用法、保留的标识符类(1)

python关键字(保留字)用法、保留的标识符类&#xff08;1&#xff09; 一、python保留字(关键字) 1.1、python关键字 以下标识符为保留字&#xff0c;或称 关键字&#xff0c;不可用于普通标识符&#xff0c;即我们不能把它们用作任何标识符名称。 python 保留字(关键字) 关键…

深度学习模型代码书写指导和建议

在深度学习模型开发中,确保 输入张量的维度和表示意义正确对齐 是至关重要的。以下是详细的指导和建议,帮助你在开发过程中减少错误,提高代码的健壮性。 1. 理解输入和输出张量的维度与含义 1.1 明确每个张量的含义和维度 在设计模型之前,确保了解每个张量的维度顺序和每…

什么叫区块链?怎么保证区块链的安全性?

区块链&#xff08;Blockchain&#xff09;是一种分布式数据库或账本技术&#xff0c;它通过去中心化的方式记录交易或其他数据&#xff0c;并确保这些记录是安全、透明和不可篡改的。区块链最初是作为比特币&#xff08;Bitcoin&#xff09;加密货币的基础技术而被公众所知&am…

【Duilib】 List控件支持多选和获取选择的多条数据

问题 使用Duilib库写的一个UI页面用到了List控件&#xff0c;功能变动想支持选择多行数据。 分析 1、List控件本身支持使用SetMultiSelect接口设置是否多选&#xff1a; void SetMultiSelect(bool bMultiSel);2、List控件本身支持使用GetNextSelItem接口获取选中的下一个索引…

mysql和redis的最大连接数

平时我们要评估mysql和redis的最大连接数&#xff0c;可以选择好环境&#xff08;比如4核8G&#xff09;,定好压测方法&#xff08;没有索引的mysql单表&#xff0c;redis单key&#xff09;进行压测&#xff0c;评估其最大并发量。 也可以查看各大云厂商的规格进行评估。 mys…

Postman配置环境变量

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Postman是一套比较方便的接口测试工具&#xff0c;但我们在使用过程中&#xff0c;可能会出现创建了API请求&#xff0c;但API的URL会随着服务器IP地址的变化而改…