python实现归并排序

本文详细介绍了归并排序算法在Python中的实现,包括基本思想、归并函数merge的步骤以及merge_sort()函数的递归调用过程。通过实例展示了如何将无序列表转换为有序,以及其稳定性和时间复杂度分析。
摘要由CSDN通过智能技术生成

排序算法:
python实现基数排序
python实现归并排序
python实现交换排序
python实现选择排序
python实现插入排序
python实现桶排序

归并排序
“归并"是将两个或者两个以上的有序表组成一个新的有序表。假定待排序表含有n个记录,则可以看成是n个有序的子表,每个子表长度为一,然后两两归并,得到n//2个长度为2或1的有序表;再两两归并,…直到合并成一个长度为n的有序表为止,这种方法称为2-路归并排序。
在这里插入图片描述
归并算法动态实现:
在这里插入图片描述
实现代码如下:

#merge的功能是将前后相邻的两个有序表归并为一个有序表的算法。
def merge(left, right):
    ll, rr = 0, 0
    result = []
    while ll < len(left) and rr < len(right):
        if left[ll] < right[rr]:
            result.append(left[ll])
            ll += 1
        else:
            result.append(right[rr])
            rr += 1
    result+=left[ll:]
    result+=right[rr:]
    return result

def merge_sort(alist):
    if len(alist) <= 1:
        return alist
    num = len(alist) // 2   # 从中间划分两个子序列
    left = merge_sort(alist[:num]) # 对左侧子序列进行递归排序
    right = merge_sort(alist[num:]) # 对右侧子序列进行递归排序
    return merge(left, right) #归并

tesl=[1,3,45,23,23,12,43,45,33,21]
print(merge_sort(tesl))
#[1, 3, 12, 21, 23, 23, 33, 43, 45, 45]

其中merge()函数用于将两个有序列表合并成一个有序列表,merge_sort()函数用于将一个无序列表排序。

归并排序的基本思想是将一个无序列表划分成两个子序列,对每个子序列进行递归排序,然后将两个有序子序列合并成一个有序列表。在merge()函数中,我们定义了两个指针ll和rr分别指向左侧子序列和右侧子序列的第一个元素,比较两个元素的大小,将较小的元素加入到结果列表中,并将指针向后移动。当一个子序列的元素已经全部加入到结果列表中时,我们将另一个子序列剩余的元素直接加入到结果列表中。

在merge_sort()函数中,我们首先判断当前列表的长度是否小于等于1,如果是,则直接返回该列表;否则,我们将列表从中间划分成两个子序列,并对每个子序列进行递归排序,然后将两个有序子序列合并成一个有序列表。
空间效率:需要n个辅助空间,因此空间复杂度为O(n)
时间效率:归并时间复杂度为O(n),一共进行log2 N趟,因此时间复杂度为O(nlog2 N)
它是一种稳定的排序算法。

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值