力扣题目
解题思路
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]
解题思路:
算法原理:
这是一个基于归并排序的算法。归并排序的基本思想是将数组不断地分成两半,对两半分别进行排序,然后将排好序的两半合并起来。
思路:
sortArray
方法用于启动整个排序过程,创建辅助数组temp
并调用mergeSort
。mergeSort
方法是递归函数,将数组不断地分割成两半,直到子数组长度为 1 。然后调用merge
方法合并。merge
方法用于合并两个已排序的子数组。通过比较两个子数组的元素,将较小的元素依次放入辅助数组temp
中。然后将temp
中的元素复制回原数组。
代码分析:
- 在
mergeSort
中,通过中间索引mid
将数组分成两部分,分别递归排序,然后合并。 - 在
merge
中,使用两个指针i
和j
分别遍历两个子数组,将元素按顺序放入temp
。再通过两个循环处理剩余的未放入temp
的元素。最后将temp
中的元素复制回原数组。
时间复杂度:O(nlogn),其中 是数组的长度。
空间复杂度:O(n),主要是辅助数组 temp
的空间开销。
java代码:
package org.example;
public class Leetcode912 {
public static void main(String[] args) {
int[] nums = {5,2,3,1};
sortArray(nums);
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + " ");
}
}
// 归并
public static int[] sortArray(int[] nums) {
int[] temp = new int[nums.length];
mergeSort(nums, 0, nums.length - 1, temp);
return nums;
}
public static void mergeSort(int[] nums, int left, int right, int[] temp) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(nums, left, mid, temp);
mergeSort(nums, mid + 1, right, temp);
merge(nums, left, mid, right, temp);
}
}
public static void merge(int[] nums, int left, int mid, int right, int[] temp) {
int i = left;
int j = mid + 1;
int k = left;
while (i <= mid && j <= right) {
if (nums[i] <= nums[j]) {
temp[k++] = nums[i++];
} else {
temp[k++] = nums[j++];
}
}
while (i <= mid) {
temp[k++] = nums[i++];
}
while (j <= right) {
temp[k++] = nums[j++];
}
for (int l = left; l <= right; l++) {
nums[l] = temp[l];
}
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项