归并排序 / 快排

这两种排序方法使用了 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))
posted @ 2017-07-02 10:40  zx576  阅读(141)  评论(0编辑  收藏  举报