【LeetCode: 912. 排序数组 + 归并排序】

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,优快云-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述
在这里插入图片描述

🚩 题目链接

⛲ 题目描述

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

你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。

示例 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 <= nums.length <= 5 * 104
-5 * 104 <= nums[i] <= 5 * 104

🌟 求解思路&实现代码&运行结果


⚡ 归并排序

🥦 求解思路
  1. sortArray(int[] arr): 这是归并排序的入口函数,它检查数组是否为空,如果是则直接返回。否则,创建一个临时数组并调用递归排序函数。
  2. mergeSort(int[] arr, int left, int right, int[] temp): 这是递归排序函数,它将数组分成两半,分别对左半部分和右半部分进行排序,然后调用merge函数将两个有序部分合并。
  3. merge(int[] arr, int left, int mid, int right, int[] temp): 这是合并函数,它将两个有序数组合并成一个有序数组,并将结果存回原数组。
  4. 有了基本的思路,接下来我们就来通过代码来实现一下。
🥦 实现代码
class Solution {
    public int[] sortArray(int[] arr) {
        if (arr == null || arr.length < 1) {
            return new int[]{}; // 如果数组为空或只有一个元素,直接返回
        }
        int[] temp = new int[arr.length]; // 创建一个临时数组用于合并
        mergeSort(arr, 0, arr.length - 1, temp);
        return arr;
    }

    // 递归排序函数
    private static void mergeSort(int[] arr, int left, int right, int[] temp) {
        if (left < right) {
            int mid = left + (right - left) / 2; // 找到中间点
            mergeSort(arr, left, mid, temp); // 对左半部分进行排序
            mergeSort(arr, mid + 1, right, temp); // 对右半部分进行排序
            merge(arr, left, mid, right, temp); // 合并两个有序部分
        }
    }

    // 合并两个有序数组
    private static void merge(int[] arr, int left, int mid, int right, int[] temp) {
        int i = left; // 左半部分的起始索引
        int j = mid + 1; // 右半部分的起始索引
        int k = 0; // 临时数组的起始索引

        // 将两个有序数组合并到临时数组中
        while (i <= mid && j <= right) {
            if (arr[i] <= arr[j]) {
                temp[k++] = arr[i++];
            } else {
                temp[k++] = arr[j++];
            }
        }

        // 将左半部分剩余的元素复制到临时数组中
        while (i <= mid) {
            temp[k++] = arr[i++];
        }

        // 将右半部分剩余的元素复制到临时数组中
        while (j <= right) {
            temp[k++] = arr[j++];
        }

        // 将临时数组中的元素复制回原数组
        k = 0;
        while (left <= right) {
            arr[left++] = temp[k++];
        }
    }

}
🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

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、付费专栏及课程。

余额充值