【分治】归并排序——排序数组(medium)

排序数组(medium)

题⽬链接:912. 排序数组

题⽬描述:

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

⽰例 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 ,使整个数组的排序过程被分为「左半部分排序」 + 「右半部分排序」;

◦ 治:将两个较短的「有序数组合并成⼀个⻓的有序数组」,⼀直合并到最初的⻓度。

算法代码:

java 复制代码
class Solution{
 int[] tmp;
 public int[] sortArray(int[] nums) {
	 tmp = new int[nums.length];
	 mergeSort(nums, 0, nums.length - 1);
	 return nums;
 }
 public void mergeSort(int[] nums, int left, int right){
	 if(left >= right) return;
	 
	 // 1. 根据中间点划分区间
	 int mid = (left + right) / 2;
	 // [left, mid] [mid + 1, right]
	 
	 // 2. 先把左右区间排个序
	 mergeSort(nums, left, mid);
	 mergeSort(nums, mid + 1, right);
	 
	 // 3. 合并两个有序数组
	 int cur1 = left, cur2 = mid + 1, i = 0;
	 while(cur1 <= mid && cur2 <= right)
	 	tmp[i++] = nums[cur1] <= nums[cur2] ? nums[cur1++] : nums[cur2++];
	 // 处理没有遍历完的数组
	 while(cur1 <= mid) tmp[i++] = nums[cur1++];
	 while(cur2 <= right) tmp[i++] = nums[cur2++];
	 // 4. 还原
	 for(int j = left; j <= right; j++) 
	 	nums[j] = tmp[j - left];
 }
}
相关推荐
hey_sml3 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo3 小时前
数据结构-环形链表
java·数据结构·链表
Forever Nore4 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
萧瑟余晖4 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才5 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio5 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
罗西的思考5 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX6 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
萧瑟余晖6 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
爱跳舞的烤冷面7 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法