Fighting-算法-归并排序

"""
归并排序:
    归并:将两个或者两个以上的有序表组成一个新的有序表。
    2-路归并排序:假定待排序表含有n个记录,则可以看成是n个有序的子表,每个子表的长度为1,然后两辆归并,得到[n/2]个长度为2或者1的有序表。
    再两两归并,.....如此重复,知道合成一个长度为n的有序表为止。
    二路归并排序(稳定排序),结果升序 算法思想:
    2-路归并排序主旨是“分解”与“归并”   
    分解:       
    1.将一个数组分成两个数组,分别对两个数组进行排序。     
    2.循环第一步,直到划分出来的“小数组”只包含一个元素, 只有一个元素的数组默认为已经排好序。   
    归并:     
    1.将两个有序的数组合并到一个大的数组中。     
    2.从最小的只包含一个元素的数组开始两两合并。此时,合并好的数组也是有序的。

"""


def merge_sort(nums):
    size = len(nums)
    if size <= 1:
        return nums
    middle = size // 2
    left = merge_sort(nums[:middle])
    right = merge_sort(nums[middle:])
    return merge(left, right)


def merge(nums_a, nums_b):
    merge_nums = []
    start_a = start_b = 0
    size_a = len(nums_a)
    size_b = len(nums_b)
    while start_a < size_a and start_b < size_b:
        if nums_a[start_a] < nums_b[start_b]:
            merge_nums.append(nums_a[start_a])
            start_a += 1
        else:
            merge_nums.append(nums_b[start_b])
            start_b += 1
    if start_a == size_a:
        for i in nums_b[start_b:]:
            merge_nums.append(i)
    else:
        for i in nums_a[start_a:]:
            merge_nums.append(i)

    return merge_nums


if __name__ == '__main__':
    nums = [49, 38, 65, 97, 76, 13, 27]
    print(merge_sort(nums))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值