【分治】归并排序——排序数组(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];
 }
}
相关推荐
weixin_3077791335 分钟前
VS Code配置MinGW64编译SQLite3库
开发语言·数据库·c++·vscode·算法
David爱编程42 分钟前
面试必问!线程生命周期与状态转换详解
java·后端
无聊的小坏坏1 小时前
拓扑排序详解:从力扣 207 题看有向图环检测
算法·leetcode·图论·拓扑学
wwww.bo1 小时前
机器学习(决策树)
算法·决策树·机器学习
辞--忧1 小时前
深入浅出决策树
算法·决策树·机器学习
Y200309161 小时前
决策树总结
算法·决策树·机器学习
lynn8570_blog1 小时前
低端设备加载webp ANR
前端·算法
LKAI.1 小时前
传统方式部署(RuoYi-Cloud)微服务
java·linux·前端·后端·微服务·node.js·ruoyi
HeyZoeHey1 小时前
Mybatis执行sql流程(一)
java·sql·mybatis
2301_793086872 小时前
SpringCloud 07 微服务网关
java·spring cloud·微服务