leetcode-归并排序

归并排序

归并排序就是先把左半边数组排好序,再把右半边数组排好序,然后把两半数组合并。

算法框架

// 定义:排序 nums[lo..hi]
void sort(int[] nums, int lo, int hi) {
    if (lo == hi) {
        return;
    }
    int mid = (lo + hi) / 2;
    // 利用定义,排序 nums[lo..mid]
    sort(nums, lo, mid);
    // 利用定义,排序 nums[mid+1..hi]
    sort(nums, mid + 1, hi);

    /****** 后序位置 ******/
    // 此时两部分子数组已经被排好序
    // 合并两个有序数组,使 nums[lo..hi] 有序
    merge(nums, lo, mid, hi);
    /*********************/
}

// 将有序数组 nums[lo..mid] 和有序数组 nums[mid+1..hi]
// 合并为有序数组 nums[lo..hi]
void merge(int[] nums, int lo, int mid, int hi);

归并排序就是二叉树的后序遍历

代码实现

class Solution:
    def sort(self, nums: List[int]) -> List[int]:

        def merge_sort(l, r):
            # 终止条件
            if l >= r: return 0
            # 递归划分
            m = (l + r) // 2
            merge_sort(l, m)
            merge_sort(m + 1, r)
           
            # 合并阶段
            i, j = l, m + 1

            # 先将nums数组复制到临时数组tmp中
            tmp[l:r + 1] = nums[l:r + 1]
            for k in range(l, r + 1):
                # 左边数组已全部合并
                if i == m + 1:
                    nums[k] = tmp[j]
                    j += 1
                # 右边数组已全部合并
                elif j == r + 1:
                    nums[k] = tmp[i]
                    i += 1
                
                elif tmp[i] <= tmp[j]:
                    nums[k] = tmp[i]
                    i += 1
                else:
                    nums[k] = tmp[j]
                    j += 1
        
        tmp = [0] * len(nums)
        merge_sort(0, len(nums) - 1)

        return nums
posted @ 2022-03-28 20:27  topbookcc  阅读(110)  评论(0编辑  收藏  举报
/* 鼠标点击求赞文字特效 */