这两种排序方法使用了 divided and conquered 的算法思想,我理解为 分--合。两种方法的实现都依赖与递归。
归并排序
归并排序图解:
逐步将列表拆分
排序后再逐步合并回来
解题的思想为,将 list 分为左右两个部分,然后对这两部分进行排序。
代码如下:
import random
# 归并排序核心代码
def merge(lst):
n = len(lst)
if n < 2:
return lst
# 将完整列表分为左右两部分
mid = n // 2
left = merge(lst[:mid])
right = merge(lst[mid:])
# 最后将其通过普通的排序算法合并
return sortlst(left, right)
# 合并两个子部分
def sortlst(left, right):
res = []
len_left = len(left)
len_right = len(right)
while left and right:
if left[0] > right[0]:
res.append(right.pop(0))
else:
res.append(left.pop(0))
res.extend(left or right)
return res
lst = list(range(10))
random.shuffle(lst)
print(merge(lst))
方法中使用到了很多 python list 方法,比如切片、append、extend 等等,不算特别通用,只能说实现了该算法。
快速排序
快速排序图解:
首先,取出列表中第一个位置的数M,然后逐步将其余的数与M做比较,分为左右两部分
然后再逐步回收
解题的思想为,将list分为左、list[0]、右三个部分,然后依次合并。
import random
def quick(lst):
n = len(lst)
if n < 2:
return lst
pivtol = lst[0]
left = []
right = []
for i in lst[1:]:
if i > pivtol:
right.append(i)
else:
left.append(i)
return quick(left)+[lst[0]]+quick(right)
lst = list(range(10))
random.shuffle(lst)
print(quick(lst))