【分治】归并排序——排序数组(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];
 }
}
相关推荐
Seven972 分钟前
剑指offer-17、树的⼦结构
java
怀旧,2 分钟前
【C++】1. C++基础知识
开发语言·c++·算法
Gerry_Liang17 分钟前
LeetCode热题100——155. 最小栈
算法·leetcode·职场和发展
我今晚不熬夜18 分钟前
JSON在java中的使用
java·开发语言·json
TechCampus32 分钟前
小红书面试中我这样解释 KMP,面试官点头了
算法
Youndry35 分钟前
验证二叉搜索树
算法
Spider_Man37 分钟前
从 "字符拼图" 到 "文字魔术":动态规划玩转字符串变形术
javascript·算法·leetcode
玄妙尽在颠倒间1 小时前
雪花算法:从 64 位到 128 位 —— 超大规模分布式 ID 生成器的设计与实现
后端·算法
Code季风1 小时前
Spring 异常处理最佳实践:从基础配置到生产级应用
java·spring boot·spring
回家路上绕了弯1 小时前
Java 堆深度解析:内存管理的核心战场
java·jvm