归并排序,含python代码和视频演示

转载自:https://procjx.github.io/2020/03/07/%E3%80%90%E7%AE%97%E6%B3%95%E3%80%91%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F-Merge-Sort/

算法介绍

归并排序,也叫合并排序,中心思想是将已排好序的两个或两个以上(常为两个)数列,合并成一个大的排序数列。为了保证这两个数列是已经排好序的,需要将数列对半分,直到该数列中只包含一个数字。

视频演示

视频地址:https://www.bilibili.com/video/av18980253

python 代码

#-*- coding: utf-8 -*-

# 升序
# 合并已经排好序的两个数列
def merge(left_data, right_data):
    merge_data = []
    L = len(left_data)
    R = len(right_data)
    i = 0
    j = 0
    while i<L and j<R:
        if left_data[i] < right_data[j]:
            merge_data.append(left_data[i])
            i += 1
        else:
            merge_data.append(right_data[j])
            j += 1
    # 结束后,i, j至少有一个到达最大值

    if i<L:
        assert j>=R
        merge_data.extend(left_data[i:])
    else:
        merge_data.extend(right_data[j:])
    return merge_data


# 递归将数据切分成两半,直到每边最多只有一个数
def merge_sort(data):
    n = len(data)
    if n<=1:
        return data
    else:
        middle = int(n//2) # 中间位置
        left_data = merge_sort(data[:middle]) # 左边数据
        right_data = merge_sort(data[middle:]) # 右边数据
        merge_data = merge(left_data, right_data) # 合并 左边数据 和 右边数据
        return merge_data


if __name__ == '__main__':
    data = [38, 27, 43, 3, 9, 82, 10]
    sorted_data = merge_sort(data.copy())
    print("排序前:", data)
    print("排序后:", sorted_data)

算法分析

归并排序需要递归切分 logn 次,时间复杂度为 O(nlogn)

归并排序空间复杂度跟实现方法有关系,最小为O(1),最大为O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值