【分治】归并排序——排序数组(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];
 }
}
相关推荐
zhaoyufei1331 分钟前
RK3566 EDP屏幕背光闪修改pwm
android·java
枫叶林FYL7 分钟前
【自然语言处理 NLP】8.3 长文本推理评估与针在大海堆任务
人工智能·算法
智者知已应修善业9 分钟前
【51单片机1,左边4个LED灯先闪烁2次后,右边4个LED灯再闪烁2次:2,接着所用灯一起闪烁3次,接着重复步骤1,如此循环。】2023-5-19
c++·经验分享·笔记·算法·51单片机
清心歌11 分钟前
HashMap实现原理及扩容机制
java
一只大袋鼠11 分钟前
数据库连接池从入门到精通(下):Druid 连接池使用与工具类封装
java·数据库·连接池
禹中一只鱼14 分钟前
【IDEA 出现 `IDE error occurred`】
java·ide·spring boot·intellij-idea
西凉的悲伤14 分钟前
Guava类库——Lists.partition() 高效分批处理列表数据
java·guava
weixin_4080996715 分钟前
【保姆级教程】按键精灵调用 OCR 文字识别 API(从0到1完整实战 + 可运行脚本)
java·前端·人工智能·后端·ocr·api·按键精灵
xiaoye-duck15 分钟前
《算法题讲解指南:优选算法-队列+宽搜》--70.N叉树的层序遍历,71.二叉树的锯齿形层序遍历,72.二叉树的最大宽度,73.在每个树行中找最大值
数据结构·c++·算法·队列
brahmsjiang16 分钟前
Java类加载机制解析:从JVM启动到双亲委派,再到Android的特殊实现
android·java·jvm