归并排序(python实现)

一、学习要点:
解决问题的思路:
根据分治思想设计程序时的思维过程:
1.一定是先找到最小问题规模时的求解方法
2.然后考虑随着问题规模增大时的求解方法
3.找到求解过程的递归函数式后,设计递归程序即可
demo 分析:
seq=[5,3,2,0,1,4]
1.首先找到最小规模时的求解方法:
当列表中只有一个元素的时候,就是最小规模。
如:
left=[5],right=[3]
将两个列表合并成一个有序的列表:
result=[]
if left[0]<=right[0]:
result.append(left[0])
else:
result.append(right[0])
result+=left此时 合并后的列表 result=[3,5]就是排序好的列表。
2.规模扩大
left=[0,3,5] right=[1,4]
将两个有序列表,合并成一个有序列表:
比较二个列表的第一个数,谁小就先取谁,取了后就在对应的列表中跳过这个数。然后再进行比较,如果有空,那就将另一个列表的数据依次取出即可:
result=[]
i=0
j=0
while i<len(left) and j<len(right):
if left[i]<=right[j]:
result.append(left[i])
i+=1
else:
result.append(right[j])
j+=1
result+=left[i:]
result+=right[j:]
3.设计递归,将复杂的问题分解为最小规模子问题。
二、代码:

def mergesort(seq):
    """归并排序"""
    if len(seq) <= 1:
        return seq
    mid = len(seq) / 2  # 将列表分成更小的两个列表
    # 分别对左右两个列表进行处理,分别返回两个排序好的列表
    left = mergesort(seq[:mid])
    right = mergesort(seq[mid:])
    # 对排序好的两个列表合并,产生一个新的排序好的列表
    return merge(left, right)

def merge(left, right):
    """合并两个已排序好的列表,产生一个新的已排序好的列表"""
    result = []  # 新的已排序好的列表
    i = 0  # 下标
    j = 0
    # 对两个列表中的元素 两两对比。
    # 将最小的元素,放到result中,并对当前列表下标加1
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result

seq = [5,3,0,6,1,4]
print '排序前:',seq
result = mergesort(seq)
print '排序后:',result```

三、运行结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190502214305470.png)
四:如看不懂,参考原博客:
https://www.jianshu.com/p/3ad5373465fd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值