归并排序模板

归并排序主要使用了分治的思想,以当前区间的中点mid作为分隔点,每一次递归划分的左右两个区间[l , mid]和[mid + 1, r],递归左右两个区间使得递归之后得到的两个区间分别有序,递归完左右区间之后对这两个有序的区间进行归并,在归并的时候需要使用到一个辅助的数组w来存储两个有序区间的数字(双指针算法将数字合并到w中),利用这个辅助数组调整当前的左右区间整体对应的区间[l, r]是有序的。其实对于当前的区间都是这样递归处理所以最终整个区间通过归并之后就是有序的,画画图会好理解一点,测试网址,代码如下:

from typing import List

class Solution:
    def mergeSort(self, nums: List[int], l: int, r: int):
        if l >= r: return
        mid = l + r >> 1
        # 递归使得左右两个区间是有序的
        self.mergeSort(nums, l, mid)
        self.mergeSort(nums, mid + 1, r)
        w = list()
        i, j = l, mid + 1
        while i <= mid and j <= r:
            if nums[i] <= nums[j]:
                w.append(nums[i])
                i += 1
            else:
                w.append(nums[j])
                j += 1
        # 左边的区间还有数字
        while i <= mid:
            w.append(nums[i])
            i += 1
        # 右边的区间还有数字
        while j <= r:
            w.append(nums[j])
            j += 1
        i = l
        # 使当前的[l, r]有序
        for j in range(len(w)):
            nums[i] = w[j]
            i += 1


if __name__ == '__main__':
    n = int(input())
    nums = list(map(int, input().split()))
    Solution().mergeSort(nums, 0, n - 1)
    for x in nums:
        print(x, end=" ")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值