• 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)
  • 相关阅读:
    ETL概念集锦
    想要快速泡大麦茶的4种方法
    Suggest blowing out the dust
    Pessimistic and optimistic locking
    操作系统简介
    初学计算机基础
    JavaScript筑基篇(三)->JS原型和原型链的理解
    网页瀑布流效果实现的几种方式
    javascript的基本语法、数据结构
    javascript如何列出全局对象的非原生属性。
  • 原文地址:https://www.cnblogs.com/LanTianYou/p/8872941.html
Copyright © 2020-2023  润新知