手撕归并排序

题目链接

归并排序

题目描述

手撕归并排序_第1张图片

注意

  • 数组不为空

解答思路

  • 使用归并排序完成排序

代码

class Solution {
    public int[] sortArray(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        return mergeSort(nums, left, right);
    }

    public int[] mergeSort(int[] nums, int left, int right) {
        int[] res = new int[right - left + 1];

        // 如果当前的子数组中只有一个元素,则直接返回
        if(left == right) {
            res[0] = nums[left];
            return res;
        }

        // 如果当前的子数组有多个元素,则将其子数组划分后进行排序
        int mid = (right + left) / 2;
        int[] leftArray = mergeSort(nums, left, mid);
        int[] rightArray = mergeSort(nums, mid + 1, right);

        // 对两个数组进行合并,使其合并后按升序排列
        int i = 0, j = 0;
        while(i + j < right - left + 1) {
            if(i == mid - left + 1) {
                // 已经访问到了左边数组的最后一位,则直接填充右数组
                res[i + j] = rightArray[j];
                j++;
            }else if(j == right - mid) {
                // 已经访问到了右边数组的最后一位,则直接填充左数组
                res[i + j] = leftArray[i];
                i++;
            }
            // 取此时指针指向的两个数组中的最小值插入到最终结果中
            else if(leftArray[i] < rightArray[j]) {
                res[i + j] = leftArray[i];
                i++;
            }else {
                res[i + j] = rightArray[j];
                j++;
            }
        }
        return res;
    }
}

关键点

  • 理解归并排序的思想:将数组从中间不断拆分成左右两个子数组,直到子数组中的元素只有一个为止,再将两个子数组合并成一个有序的数组,以此类推,不断将有序的两个子数组合并成一个新的有序的子数组,最终就可得到整个排序后的数组

你可能感兴趣的:(算法,算法,leetcode,java,归并排序)