力扣题目
解题思路
java代码
力扣题目:
给你一个整数数组 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]
解题思路:
一、整体思路
这段代码实现了归并排序算法,用于对给定的整数数组进行排序。
main
方法:创建了一个示例数组nums
,调用sortArray
方法对其排序,并打印排序后的结果。sortArray
方法:为归并排序的入口,创建一个与输入数组长度相同的辅助数组temp
,然后调用mergeSort
方法进行递归排序。mergeSort
方法:通过不断将数组分割为两半,直到子数组长度为 1 ,然后调用merge
方法合并已排序的子数组。merge
方法:将两个已排序的子数组合并为一个有序的数组。首先比较两个子数组的元素,将较小的元素放入辅助数组temp
中。当其中一个子数组遍历完后,将另一个子数组剩余的元素放入temp
。最后将temp
中的已排序部分复制回原数组。
二、代码详解
-
mergeSort
方法:- 通过条件
if (left >= right)
来判断子数组长度是否为 1 ,如果是则直接返回,因为单个元素的子数组已经是有序的。 - 计算中间索引
mid
,将数组分为左右两部分,然后对这两部分分别递归调用mergeSort
方法进行排序。
- 通过条件
-
merge
方法:- 使用三个指针
i
、j
和t
分别指向两个子数组和辅助数组。 - 通过一个循环比较两个子数组的元素,并将较小的元素放入
temp
。 - 当其中一个子数组遍历完后,通过两个额外的循环将另一个子数组剩余的元素放入
temp
。 - 最后将
temp
中的排序结果复制回原数组。
- 使用三个指针
三、示例说明
以数组 {5, 2, 3, 1}
为例:
第一次调用 mergeSort
,将数组分为 {5, 2}
和 {3, 1}
。
对于 {5, 2}
,再分为 {5}
和 {2}
,然后合并为 {2, 5}
。
对于 {3, 1}
,再分为 {3}
和 {1}
,然后合并为 {1, 3}
。
最后合并 {2, 5}
和 {1, 3}
得到最终的排序结果 {1, 2, 3, 5}
。
java代码:
package org.example.mouth8;
public class Leetcode912 {
public static void main(String[] args) {
int[] nums = {5, 2, 3, 1};
Leetcode912 leetcode912 = new Leetcode912();
int[] ints = leetcode912.sortArray(nums);
for (int anInt : ints) {
System.out.println(anInt);
}
}
// 归并排序
public int[] sortArray(int[] nums) {
int[] temp = new int[nums.length];
mergeSort(nums, 0, nums.length - 1, temp);
return temp;
}
public void mergeSort(int[] nums, int left, int right, int[] temp) {
if (left >= right) {
return;
}
int mid = left + (right - left) / 2;
mergeSort(nums, left, mid, temp);
mergeSort(nums, mid + 1, right, temp);
merge(nums, left, mid, right, temp);
}
public void merge(int[] nums, int left, int mid, int right, int[] temp) {
int i = left;
int j = mid + 1;
int t = 0;
while (i <= mid && j <= right) {
if (nums[i] <= nums[j]) {
temp[t++] = nums[i++];
} else {
temp[t++] = nums[j++];
}
}
while (i <= mid) {
temp[t++] = nums[i++];
}
while (j <= right) {
temp[t++] = nums[j++];
}
// 将排好序的部分复制回原数组
for (int k = left; k <= right; k++) {
nums[k] = temp[k - left];
}
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项