首页 > 其他分享 >LeetCode 912.排序数组

LeetCode 912.排序数组

时间:2022-11-25 14:00:59浏览次数:49  
标签:index temp nums int start 数组 排序 LeetCode 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. 1 <= nums.length <= 50000

2. -50000 <= nums[i] <= 50000


题目分析:

假设有以下数组需要排序,我们采用归并排序解法。

LeetCode 912.排序数组_归并排序


首先将数组分割成两个部分。

LeetCode 912.排序数组_归并排序_02


分别对其进行归并排序。排完序得到以下两个数组。排序的方法同样是分割数组,直到不能再分割为止,然后合并两个子数组,合并方法与最后一次合并同理,这里不再赘述,最后的合并方法如下。

LeetCode 912.排序数组_递归_03


定义两个指针分别指向两个数组的首元素。比较两个值的大小,将小的数依次赋给临时数组。如下图,10小于40,将10赋给临时数组,并使临时数组的索引指针以及右边数组的指针移动,继续进行下一轮检查。

LeetCode 912.排序数组_递归_04


同理,40小于70,把40赋给临时数组,移动指针。

LeetCode 912.排序数组_递归_05


直到两个数组的值都赋给了临时数组,排序也就完成。

LeetCode 912.排序数组_递归_06


题解:

执行用时: 10 ms

内存消耗: 47.8 MB

class Solution {
public int[] sortArray(int[] nums) {
// 创建临时数组,用于归并
int[] temp = new int[nums.length];
// 调用归并排序方法
mergeSort(nums, 0, nums.length - 1, temp);
// 返回排序完的结果
return nums;
}


public void mergeSort(int[] nums, int start, int end, int[] temp) {
// 递归结束条件
if (start >= end)
return;
// 获取中点
int mid = (start + end) / 2;
// 递归排序
mergeSort(nums, start, mid, temp);
mergeSort(nums, mid + 1, end, temp);
// 合并排完序的两个数组
merge(nums, start, mid, end, temp);
}


public void merge(int[] nums, int start, int mid, int end, int[] temp) {
// 定义左右指针分别指向两个待合并的数组头
int left = start;
int right = mid + 1;
// 定义索引指针指向临时数组头
int index = start;
// 同时遍历两个数组,把小的元素依次放入临时数组
while (left <= mid && right <= end) {
// 当左数组指向元素 小于 右数组指向元素时,把左数组指向的元素放入
if (nums[left] < nums[right])
temp[index++] = nums[left++];
// 否则,把右数组指向元素放入
else
temp[index++] = nums[right++];
}
// 如果左数组还有剩余元素,直接追加到临时数组后面
while (left <= mid)
temp[index++] = nums[left++];
// 如果右数组还有剩余元素,直接追加到临时数组后面
while (right <= end)
temp[index++] = nums[right++];
// 用临时数组的值覆盖原数组
for (index = start; index <= end; index++)
nums[index] = temp[index];
}
}


题目来源:力扣(LeetCode)



标签:index,temp,nums,int,start,数组,排序,LeetCode,912
From: https://blog.51cto.com/u_15891283/5886640

相关文章

  • 6分钟彻底掌握冒泡排序
    冒泡排序原理    冒泡排序(BubbleSort),重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作......
  • LeetCode 15. 三数之和(中等)
    题目描述:给你一个包含​​n​​​个整数的数组​​nums​​​,判断 ​​nums​​ 中是否存在三个元素a,b,c,使得 a+b+c=0?请你找出所有和为​​0​​且不重......
  • LeetCode 16.最接近的三数之和(中等)
    题目描述:给你一个长度为​​n​​​的整数数组 ​​nums​​​ 和一个目标值 ​​target​​​。请你从​​nums​​​中选出三个整数,使它们的和与 ​​target​......
  • LeetCode 739.每日温度(中等)
    题目描述:请根据每日​​气温​​​列表​​temperatures​​​,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用​​0​​来代替......
  • LeetCode 20.有效的括号(简单)
    题目描述:给定一个只包括​​'('​​​,​​')'​​​,​​'{'​​​,​​'}'​​​,​​'['​​​,​​']'​​​ 的字符串​​s​​,判断字符串是否有效。有效字符串需满足:......
  • LeetCode 155.最小栈(简单)
    题目描述:设计一个支持​​push​​​,​​pop​​​,​​top​​操作,并能在常数时间内检索到最小元素的栈。​​push(x)​​——将元素x推入栈中。​​pop()​​ —......
  • LeetCode 769.最多能完成排序的块(中等)
    题目描述:数组​​arr​​​是​​[0,1,...,arr.length-1]​​的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果......
  • LeetCode 240.搜索二维矩阵II(中等)
    题目描述:编写一个高效的算法来搜索 ​​m x n​​​ 矩阵​​matrix​​​中的一个目标值​​target​​。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的......
  • LeetCode 232.用栈实现队列(简单)
    题目描述:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(​​push​​​、​​pop​​​、​​peek​​​、​​empty​​):实现​​MyQueu......
  • LeetCode 448.找到所有数组中消失的数字(简单)
    题目描述:给你一个含​​n​​​个整数的数组​​nums​​​,其中​​nums[i]​​​在区间​​[1,n]​​​内。请你找出所有在​​[1,n]​​​范围内但没有出现......