Pythonic版冒泡排序和快速排序(附:直接插入排序)

[本文出自天外归云的博客园]

冒泡排序:就是每次排序选最大元素到数组a的最后,排 len(a)-1 次。也就是两个for循环:

  1. 外层是待排数组长度的循环,从待排数组长度(初始待排数组长度等于数组长度)到0的循环;

  2. 内层是相邻元素比较的循环,从0到待排数组长度的循环。

快速排序:就是一个递归函数A,把数组中头元素做key,比key小的(包括相等的)放key左边,比key大的放key右边。再对左边和右边的子数组分别调用递归函数A。这是快排。

代码如下:

import random


def bubble_show(func):
    def wrapper(*args):
        print(f"[{func.__name__}]")
        random.shuffle(args[0])
        print(f"Before {func.__name__}: {args[0]}")
        r = func(*args)
        print(f"After {func.__name__}: {r}")
        return r

    return wrapper


@bubble_show
# 冒泡排序
def bubble_sort(a):
    for i in range(len(a))[::-1]:
        for j in range(0, i):
            (a[j], a[j + 1]) = (a[j + 1], a[j]) if a[j] >= a[j + 1] else (a[j], a[j + 1])
    return a


# 快速排序
quick_sort = lambda a: a if len(a) <= 1 else quick_sort([i for i in a[1:] if i <= a[0]]) + [a[0]] + quick_sort(
    [i for i in a[1:] if i > a[0]])

if __name__ == '__main__':
    a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
    bubble_sort(a)

    random.shuffle(a)
    print("[quick_sort]")
    print(f"Before quick sort: {a}")
    print(f"After quick sort: {quick_sort(a)}")

代码量确实是非常少啊~!运行结果:

 
附:直接插入排序(不怎么pythonic,所以是附的)
def insert_sort(numbers):
    for i in range(1, len(numbers)):
        key = numbers[i]
        j = i - 1
        while j >= 0:
            if numbers[j] > key:
                numbers[j + 1] = numbers[j]
                numbers[j] = key
            j -= 1

    print(numbers)
    return numbers

insert_sort(data)

 

posted @ 2018-04-18 11:12  天外归云  阅读(393)  评论(0编辑  收藏  举报