每日一题:Leetcode-912 排序数组(手撕归并排序)

力扣题目

解题思路

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 中的已排序部分复制回原数组。

二、代码详解

  1. mergeSort 方法:

    • 通过条件 if (left >= right) 来判断子数组长度是否为 1 ,如果是则直接返回,因为单个元素的子数组已经是有序的。
    • 计算中间索引 mid ,将数组分为左右两部分,然后对这两部分分别递归调用 mergeSort 方法进行排序。
  2. 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];
        }
    }
}

更多详细内容同步到公众号,感谢大家的支持!

每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

L.2626

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

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

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

打赏作者

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

抵扣说明:

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

余额充值