归并排序

归并排序采用了分治的思想,以及递归的写法。

image
[图解来源:排序算法:归并排序【图解+代码】]

合并两个有序数组的示意图:
image
[图解来源:图解排序算法(四)之归并排序]

代码实现:

class Solution {
    public int[] sortArray(int[] nums) {
        int[] tempArr = new int[nums.length];
        mSort(nums, tempArr, 0, nums.length-1);
        return nums;
    }
    public void mSort(int[] nums, int[] tempArr,int left, int right){
        //如果只有一个元素就不需要划分
        if(left < right){
            int mid = (left+right)/2;
            //递归划分左半区
            mSort(nums, tempArr, left, mid);
            //递归划分右半区
            mSort(nums, tempArr, mid+1, right);
            //合并
            merge(nums, tempArr, left, mid, right);
        }
    }
    public void merge(int[] nums, int[] tempArr,int left, int mid, int right){
        int l_pos = left;//标记左半区第一个元素
        int r_pos = mid + 1;//标记右半区第一个元素
        int pos = left;//临时数组元素下标
        while(l_pos <= mid && r_pos <= right){
            if(nums[l_pos] < nums[r_pos]){
                tempArr[pos++] = nums[l_pos++];
            }else{
                tempArr[pos++] = nums[r_pos++];
            }
        }
        //合并左半区剩余元素
        while(l_pos <= mid){
            tempArr[pos++] = nums[l_pos++];
        }
        //合并右半区剩余元素
        while(r_pos <= right){
            tempArr[pos++] = nums[r_pos++];
        }
        while(left <= right){
            nums[left] = tempArr[left];
            left++;
        }
    }
}
posted @ 2023-03-10 20:24  凉白茶  阅读(33)  评论(0编辑  收藏  举报