zoukankan      html  css  js  c++  java
  • <算法图解>读书笔记:第4章 快速排序

    第4章 快速排序

    4.1 分而治之

    “分而治之”( Divide and conquer)方法(又称“分治术”) ,是有效算法设计中普遍采用的一种技术。
    所谓“分而治之” 就是把一个复杂的算法问题按一定的“分解”方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的解,把各部分的解组成整个问题的解,这种朴素的思想来源于人们生活与工作的经验,也完全适合于技术领域。诸如软件的体系结构设计、模块化设计都是分而治之的具体表现。
    来自<百度百科>

    • 使用D&C(分而治之)解决问题的过程包括两个步骤:
      1. 找出基线条件,这种条件必须尽可能简单
      2. 不断将问题分解(或者说缩小规模),知道符合基线条件
    • D&C并非解决问题的算法,而是一种解决问题的思路
    • 编写设计数组的递归函数时,基线条件通常是数组为空或只包含一个元素

    4.2 快速排序

    • 快速排序是一种常用的排序算法,比选择排序快得多.例如,C语言标准库中的函数qsort实现的就是快速排序.快速排序也使用D&C

    快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    • 快速排序的工作原理

      1. 首先从数组中选择一个元素,这个元素称为基准值
      2. 接下来找出比基准值小的元素以及比基准值大的元素,这被称为分区
        • 只是进行分区,得到的两个子数组是无序的
      3. 对两个子数组进行快速排序
    • python快速排序代码

      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)
      
      myList = [5,3,25,6,9,11,1,66,21,88,74,2]
      print(quicksort(myList))
      

    4.3 再谈大O表示法

    • 快速排序的独特之处在于,其速度取决于选择的基准值
    • 快速排序在最糟糕的情况运行时间为(O _{(n^2)}),平均情况运行时间为(O _{(n^*logn)})

    4.4 小结

    • D&C将问题分解
    • 实现快速排序时,请随机地选择用在基准值的元素,快速排序的平均运行时间为(O _{(n^*logn)})
    • 大O表示法的常量有时候事关重大,这就是快速排序比合并排序块的原因所在
    • 比较简单查找和二分查找时,常量几乎无关紧要,因为列表很长时,(O _{(n^*logn)})的速度比(O _{(n)})快得多
  • 相关阅读:
    c# tabcontrol事件以及上下文菜单
    RDBMS架构的开源DW/DSS引擎列表
    spider RPC管理接口
    spider RPC高级特性
    linux TCP: time wait bucket table overflow
    设计一个较好的框架的难点之一--API兼容性的设计
    windows 7/10下安装oracle 10g
    mybatis同时启用mapperscanner和传统DAO
    windows根据端口号找进程
    The POM for XXX:jar:${com.ld.base.service.version} is missing, no dependency information available
  • 原文地址:https://www.cnblogs.com/wangbaby/p/10291269.html
Copyright © 2011-2022 走看看