python排序算法之归并排序

开始之前先看归并排序菜鸟教程的动画

归并排序动画

归并排序的整体思想如下

合并两个有序集合
有两个有序的序列,分别为[1,4,7],[2,3,5],现在考虑将这两个序列合并成一个有序的序列。
首先创建一个新的序列,分别从两个序列中取出第一个数,1和2,1比2小,把1放到新的序列中
第一个序列中的1已经放到新序列中,那么拿出4来进行比较,2比4小,把2放到新的序列中
第二个序列中的2已经放到新序列中,那么拿出3来进行比较,3比4小,把3放到新的序列中
第二个序列中的3已经放到新序列中,那么拿出5来进行比较,4比5小,把4放到新的序列中
第一个序列中的4已经放到新序列中,那么拿出7来进行比较,5比7小,把5放到新的序列中
最后把7放入到新的序列中
合并的方法就是分别从两个序列中拿出一个数来进行比较,小的那个放到新的集合中,然后从小的所属的序列中再拿出一个数来比较
def merge_lst(left_lst,right_lst):
    left_index,right_index = 0,0
    res_lst = []
    while left_index < len(left_lst) and right_index < len(right_lst):
        #小的放到res_lst中
        if left_lst[left_index] < right_lst[right_index]:
            res_lst.append(left_lst[left_index])
            left_index = left_index + 1
        else:
            res_lst.append(right_lst[right_index])
            right_index += 1
    if left_index == len(left_lst):
        res_lst.extend(right_lst[right_index:])
    else:
        res_lst.extend(left_lst[left_index:])
    
    return res_lst
归并排序
归并排序利用了合并有序序列的思想,把一个序列分成A,B两个序列,如果这两个序列是有序的,那么直接合并就可以了,但是如果A,B两个序列未必是有序的,没关系,如果A序列无序,那么我们再分一次,分成A1,A2,如果有序就直接合并。如果还是不是有序的,再分一次,一定是有序的。然后再合并就可以了。这样一层一层合并就是有序的序列了。
def merge_sort(lst):
    if len(lst) <= 1:
        return lst
    
    middle = len(lst) // 2
    left_lst = merge_sort(lst[:middle])
    right_lst = merge_sort(lst[middle:])
    return merge_lst(left_lst,right_lst)

if __name__ == "__main__":
    lst = [19,4,2,8,3,167,174,34]
    print(merge_sort(lst))
总体代码如下
def merge_lst(left_lst,right_lst):
    left_index,right_index = 0,0
    res_lst = []
    while left_index < len(left_lst) and right_index < len(right_lst):
        #小的放到res_lst中
        if left_lst[left_index] < right_lst[right_index]:
            res_lst.append(left_lst[left_index])
            left_index = left_index + 1
        else:
            res_lst.append(right_lst[right_index])
            right_index += 1
    if left_index == len(left_lst):
        res_lst.extend(right_lst[right_index:])
    else:
        res_lst.extend(left_lst[left_index:])
    
    return res_lst



def merge_sort(lst):
    if len(lst) <= 1:
        return lst
    
    middle = len(lst) // 2
    left_lst = merge_sort(lst[:middle])
    right_lst = merge_sort(lst[middle:])
    return merge_lst(left_lst,right_lst)

if __name__ == "__main__":
    lst = [19,4,2,8,3,167,174,34]
    print(merge_sort(lst))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值