一、学习要点:
解决问题的思路:
根据分治思想设计程序时的思维过程:
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