归并排序写不出来?可能是你思路太乱

本文详细解析了归并排序的思路与实现过程,通过分而治之的方法,阐述了如何从理解到动手编写归并排序代码。重点介绍了归并排序的核心思想、所需额外空间以及递归步骤,并提供了合并操作的详细解释,帮助开发者解决「一看就会,一写就废」的问题。同时,文中还提及了一个使用归并排序思想的数组逆序对问题。
摘要由CSDN通过智能技术生成

归并排序的思想还是很简单的,但我之前也有的烦恼:一看就会,一写就废。看着不就是简单的分和并嘛,为啥一写就一脸懵逼。

所以我决定来捋一捋归并排序,捋完发现写代码比思想还简单嘛。

1.首先要记住归并排序的一些重点: 核心思想是分而治之,需要用到O(N)的额外空间 。根据这两点可以确定归并方法的参数

//nums是原数组,left和right是左右边界下标,因为要分而治之
//temp是额外的辅助数组
mergeSort(int[] nums, int left, int right, int[] temp)

2.把参数写上之后,思路会明确很多,归并排序的步骤就是

  • 排序好左边

  • 排序好右边

  • 然后左右合并即可

  • 看递归终止条件条件,如果说left == right的话,一个数是自然有序的,所以if里判断是left<right。

public 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);//合并
        }
        
    }

3.再来看merge方法,合并的操作,现在问题变成了类似:
两个有序数组合并成一个有序数组, 辅助数组的意义就是在此

  • 先将两个数组的数字依次比较大小,有序的放入辅助数组

  • 再将辅助数组拷贝给原数组。

public void merge(int[] nums, int left, int mid, int right, int[] temp) {
		//为什么需要额外变量?
		//因为left和right后面还要用做数组拷贝
        int l = left, r = mid + 1, index = left;
        while (l <= mid && r <= right) {
            if (nums[l] > nums[r]) {
                temp[index++] = nums[r++];
                k += mid - l + 1;
            } else {
                temp[index++] = nums[l++];
            }
        }
        while (l <= mid) {
            temp[index++] = nums[l++];
        }
        while (r <= right) {
            temp[index++] = nums[r++];
        }
        //合并完成,然后进行拷贝工作

        for (int i = left; i <= right; i++) {
            nums[i] = temp[i];
        }
    }

感兴趣的兄弟们可以看看这道题,就是用到归并排序的思想 。数组中的逆序对

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值