好久不见!由于做比赛项目和期末考试搁置了一个多月没更新博客...今天先补一篇归并排序的灵魂推导!
(下面会以调试器的截图一步步看归并排序的变量的变化过程)
首先,归并排序使用分而治之的策略,即把序列不停地二分,直到最小单元,再不停地合并,同时进行排序,通过函数递归最终实现分而治之的结果。
代码如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Jul 16 16:24:59 2019
@author: honorwh
"""
#归并排序
#分而治之
#递归
def MergeSort(A):
if len(A) <= 1:
return A
half = int(len(A) // 2)
first = MergeSort(A[0:half])
second = MergeSort(A[half:len(A)])
i = 0
j = 0
newA = []
while i < len(first) or j < len(second):
if i < len(first) and j < len(second):
if first[i] <= second[j]:
newA.append(first[i])
i += 1
else:
newA.append(second[j])
j += 1
else:
if i < len(first):
newA.append(first[i])
i += 1
if j < len(second):
newA.append(second[j])
j += 1
return newA
A = [3,1,5,6,7,4,2,8]
A = MergeSort(A)
print(A)
这个代码其实挺好理解的,下面开始图片化过程,以图片右上角的变量名的value值变化,再加上自己手动推导,可以更深入的理解记忆归并排序。
到这里,first已经排好了,second也同理,留给自己推导就好了。
最终排序完成,也学会了如何在Spyder单步调试,一举两得。接下来会继续不断更新博文,谢谢观看。