zoukankan      html  css  js  c++  java
  • [笔记]《算法图解》第四章 快速排序

    分而治之(divide and conquer, D&C)

    一种著名的递归式问题解决方法。

    D&C的工作原理

    • 找出简单的基线条件
    • 确定如何缩小问题的规模,使其符合基线条件。

    D&C将问题逐步分解。使用D&C处理列表时,基线条件很可能是空数组或只包含一个元素的数组。

    快速排序

    • 实现快速排序时,请随机地选择用作基准值的元素。
    • 快速排序的平均运行时间为O(n log n)。
    • 大O表示法中的常量有时候事关重大,这就是快速排序比合并排序快的原因所在。
    • 比较简单查找和二分查找时,常量几乎无关紧要, 因为列表很长时, O(log n)的速度比O(n)快得多。

    代码实现

    def quicksort(array):
        if len(array) < 2:
            return array
        # 基线条件:为空或只包含一个元素的数组是“有序”的
    else:
        pivot = array[0]
        # 递归条件:由所有小于基准值的
        less = [i for i in array[1:] if i <= pivot]
        # 元素组成的子数组
        greater = [i for i in array[1:] if i > pivot]
        # 由所有大于基准值的元素组成的子数组
        return quicksort(less) + [pivot] + quicksort(greater)
    print(quicksort([10, 5, 2, 3]))
    

    小结

    • D&C将问题逐步分解。使用D&C处理列表时,基线条件很可能是空数组或只包含一个元素的数组。
    • 实现快速排序时,请随机地选择用作基准值的元素。快速排序的平均运行时间为O(n log n)。
    • 大O表示法中的常量有时候事关重大,这就是快速排序比合并排序快的原因所在。
    • 比较简单查找和二分查找时,常量几乎无关紧要,因为列表很长时, O(log n)的速度比O(n)快得多。
  • 相关阅读:
    文件操作_1-24 选择题
    文件操作_1-22 选择题
    文件操作_1-21 选择题
    druid与知乎平台
    b树和b+树
    mybatis generator的generatorConfig.xml配置详解
    logback日志配置文件
    单链表每k个节点为一组进行反转(最后不满k个时不反转)
    单链表每k个节点一组进行反转(最后不足k个也反转)
    shell 结合expect实现ssh登录并执行命令
  • 原文地址:https://www.cnblogs.com/everfight/p/grokking_algorithms_note_4.html
Copyright © 2011-2022 走看看