LeetCode 912. 排序数组

本文介绍了LeetCode912题目的解题思路,使用了经典的快速排序算法对整数数组进行排序。通过分析问题,我们实现了时间复杂度为O(n log n)的解决方案。代码示例中展示了如何用Java实现快速排序,从而达到数组升序排列的目的。

LeetCode 912. 排序数组

题目描述

给你一个整数数组 nums,请你将该数组升序排列。

示例 1:
输入:nums = [5,2,3,1]
输出:[1,2,3,5]

排序数组
提示:


一、解题关键词


二、解题报告

1.思路分析

请叫我 API工程师

2.时间复杂度

3.代码示例

class Solution {
    public int[] sortArray(int[] nums) {
        Arrays.sort(nums);
        return nums;
    }
}

2.知识点



总结

LeetCode 912排序数组有多种解题方法,以下为你详细介绍: ### 归并排序 归并排序是一种分治算法,其核心思想是将数组不断分割为更小的子数组,直至子数组长度为 1,再将这些已排序的子数组合并成一个有序数组。 ```java class Solution { public int[] sortArray(int[] nums) { int[] temp = new int[nums.length]; mergeSort(nums, 0, nums.length - 1, temp); return nums; } private void mergeSort(int[] nums, int left, int right, int[] temp) { if (left < right) { int mid = left + (right - left) / 2; mergeSort(nums, left, mid, temp); mergeSort(nums, mid + 1, right, temp); merge(nums, left, mid, right, temp); } } private 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 p = left; p <= right; p++) { nums[p] = temp[p]; } } } ``` 此方法中,`sortArray` 是归并排序的入口,创建辅助数组 `temp` 并调用 `mergeSort` 进行递归排序。`mergeSort` 把数组不断分割为两半,`merge` 则将两个已排序的子数组合并成一个有序数组[^2]。 ### 快速排序 快速排序也是一种分治算法,其步骤为选择一个主元,将数组分为两部分,左边元素小于等于主元,右边元素大于主元,然后对左右两部分递归排序。 ```java import java.util.Random; class Solution { private Random random = new Random(); public int[] sortArray(int[] nums) { quickSort(nums, 0, nums.length - 1); return nums; } private void quickSort(int[] nums, int left, int right) { if (left < right) { int pivotIndex = partition(nums, left, right); quickSort(nums, left, pivotIndex - 1); quickSort(nums, pivotIndex + 1, right); } } private int partition(int[] nums, int left, int right) { int randomIndex = left + random.nextInt(right - left + 1); swap(nums, randomIndex, right); int pivot = nums[right]; int i = left - 1; for (int j = left; j < right; j++) { if (nums[j] <= pivot) { i++; swap(nums, i, j); } } swap(nums, i + 1, right); return i + 1; } private void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } } ``` 这里,`sortArray` 是快速排序的入口,调用 `quickSort` 进行排序。`quickSort` 不断对数组进行分区并递归排序,`partition` 方法选择主元并进行分区操作,`swap` 用于交换数组元素[^4]。 ### 使用 API 排序 利用 Java 的 `Arrays.sort` 方法可以简洁地实现排序。 ```java import java.util.Arrays; class Solution { public int[] sortArray(int[] nums) { Arrays.sort(nums); return nums; } } ``` 此方法直接调用 `Arrays.sort` 对数组进行排序,代码简洁,但不利于深入理解排序算法的原理[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大涛小先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值