算法图解第四章笔记与习题(快速排序)

文章目录

  • 算法图解第四章笔记与习题(快速排序)
    • 4.1 分而治之
    • 4.2 快速排序
    • 4.3 大$O$表示法的平均情况和最糟情况
    • 4.4 小结
    • 练习
        • 习题4.1
        • 习题4.2
        • 习题4.3
        • 习题4.4
      • 使用大O表示法时,下面各种操作都需要多长时间?
        • 习题4.5
        • 习题4.6
        • 习题4.7
        • 习题4.8

4.1 分而治之

分而治之(divide and conquer)D&G是一种著名的递归式问题解决方法。——分而治之是递归的。

分而治之的算法是递归的。使用分而治之算法解决问题的过程包括两个步骤。

(1)找出基线条件,这种条件必须尽可能接单。

(2)不断地将问题分解(或者说缩小规模),直到使其符合基线条件。

例如,对于数组类问题的基线条件,则常常是数组为空,或数组内仅有一个元素。分解方式则通常是将其分为两个尽可能等大小的数组。

4.2 快速排序

def quicksort(array):if len(array) < 2:    # 基线条件:为空或只包含一个元素的数组是“有序”的return arrayelse:                 # 递归条件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]))

4.3 大OOO表示法的平均情况和最糟情况

  • 最糟情况指的是算法运行时可能遇到的最坏的情况。

  • 平均情况指的是算法遇到时的最佳情况。(最佳情况也是平均情况)

快速排序的平均情况为O(nlog⁡n)O(n\log n)O(nlogn),最糟情况为O(n2)O(n^2)O(n2)。这取决于基准值选取的好坏。

当每次基准值选取的均为最差情况时,则需要对包含nnn个元素的数组进行nnn次基准值的选取。当每次基准这选取的均为最佳情况时,则仅需要log⁡n\log nlogn次选取。(二分)

而当每一次选取基准值后,数组的每个元素均需要和基准值进行对比,因此,每次选取基准值之后需要进行nnn次比较。

因此,快速排序的最糟情况为O(n∗n)=O(n2)O(n* n)=O(n^2)O(n∗n)=O(n2),平均情况为O(nlog⁡n)O(n\log n)O(nlogn)。

4.4 小结

  • 分而治之算法将问题逐步分解。使用分而治之算法处理列表时,基线条件很可能是空数组或只包含一个元素的数组。
  • 实现快速排序时,请随机地选择用作基准值的元素。快速排序的平均运行时间为O(nlog⁡n)O(n \log n)O(nlogn)。
  • 大OOO表示法中的常量有时候事关重大,这就是快速排序比合并排序快的原因所在。
  • 比较简单查找和二分查找时,常量几乎无关紧要,因为列表很长时,O(log⁡n)O(\log n)O(logn)的速度比O(n)O(n)O(n)快得多。

练习

习题4.1

  • 请编写前述sum函数的代码。(递归求和,基线条件为数组空)
def sum(arr):if arr  == []:    # 基线条件:数组为空return 0
#    elif len(arr) == 1:    # 基线条件:数组内只有一个元素(可省略)
#        return arr[0]else:return arr[0] + sum(arr[1:])    # 递归条件:计算数组中第一个元素外元素的和,并与第一个元素再相加

习题4.2

  • 编写一个递归函数来计算列表包含的元素数。
def count(arr):if arr  == []:    # 基线条件:数组为空return 0
#    elif len(arr) == 1:    # 基线条件:数组内只有一个元素(可省略)
#        return 1else:return 1 + count(arr[1:])    # 递归条件:计算数组中第一个元素外剩余元素个数,再加一

上面两题中,数组内只有一个元素的情况均可省略。因为数组只有一个元素——即剩余数组为空的情况,已经被基线条件包含了,因此可以省略。

习题4.3

  • 找出列表中最大的数字。
def max(arr):if arr  == []:    # 基线条件:数组为空return Noneelif len(arr) == 1:    # 基线条件:数组内只有一个元素return arr[0]elif len(arr) == 2:    # 基线条件:数组内有两个元素,返回最大值(可用内置的max()代替)if arr[0] > arr[1]:return arr[0]else:return arr[1]else:return max([arr[0], max(arr[1:])])    # 递归条件:比较第一个元素与数组中剩余元素的最大值。

习题4.4

  • 还记得第1章介绍的二分查找吗?它也是一种分而治之算法。你能 找出二分查找算法的基线条件和递归条件吗?

基线条件:数组中仅剩一个元素(是否为查找元素为另外的判断,不属于基线条件之内)

递归条件:将数组分为两部分,如果查找值比第一部分的最大值小,则对第一部分继续二分查找,否则对剩余部分进行二分查找。

使用大O表示法时,下面各种操作都需要多长时间?

习题4.5

  • 打印数组中每个元素的值。

每个元素进行一次打印操作。$O(n) $。

习题4.6

  • 将数组中每个元素的值都乘以2。

n个元素进行一次乘法操作。故为O(n)O(n)O(n) 。

习题4.7

  • 只将数组中第一个元素的值乘以2。

O(1)O(1)O(1)。

习题4.8

  • 根据数组包含的元素创建一个乘法表,即如果数组为[2, 3, 7, 8, 10],首先将每个元素 都乘以2,再将每个元素都乘以3,然后将每个元素都乘以7,以此类推。

n个元素做n次乘法操作。故为O(n2)O(n^2)O(n2) 。

算法图解第四章笔记与习题(快速排序)相关推荐

  1. 算法图解第六章笔记与习题(广度优先搜索)

    算法图解第六章笔记与习题(广度优先搜索) 文章目录 算法图解第六章笔记与习题(广度优先搜索) 6.1 图(graph) 6.2 广度优先搜索 6.3.1 查找最短路径 6.3.2 队列 6.4 实现图 ...

  2. 《学习JavaScript数据结构与算法》 第四章笔记 栈

    文章目录 前言 一.栈? 二.构建两种栈的大致步骤 三.创建基于数组的栈 创建class Stack 定义用于操作栈的方法 使用栈 四.创建基于对象的栈 创建class Stack 定义用于操作栈的方 ...

  3. 《算法图解》第二章笔记与课后练习_选择排序算法

    软件环境:Python 3.7.0b4 一.选择排序 # 找出数组中的最小元素 def findSmallest(arr):# 存储最小的值smallest = arr[0]# 存储最小元素的索引sm ...

  4. 算法图解第二章笔记与习题(选择排序)

    算法图解第二章笔记与习题(选择排序) 文章目录 算法图解第二章笔记与习题(选择排序) 2.2 数组和链表 2.2.1 链表 2.2.2 数组 2.2.3 数组和链表的读取.插入和删除操作的时间复杂度 ...

  5. 机器学习实战 基于_机器学习实战:基于Scikit-Learn和TensorFlow—第四章笔记

    机器学习实战:基于Scikit-Learn和TensorFlow---第四章笔记 一.学习目标 之前用了那么多的机器学习的模型,但是它们各自的训练算法在很大程度上还是一个黑匣子,我们对对系统内部的实现 ...

  6. 算法复习第四章动态规划

    算法复习第四章动态规划 动态规划 TSP问题 0-1bag 动态规划 TSP问题 0-1bag 最长公共子序列不考:

  7. 《算法笔记》第四章笔记

    <算法笔记>第四章 排序 排序算法的思想都比较简单,而且c++可以直接用sort函数进行排序,一般不会直接写排序代码 归根到底就是每轮处理一个数据,n个数据只需处理n-1次即可变得有序 选 ...

  8. 【Java数据结构与算法】第四章 栈实现综合计算器

    第四章 栈实现综合计算器 文章目录 第四章 栈实现综合计算器 一.栈 1.介绍 2.应用场景 3.思路 4.代码实现 二.综合计算器 v1.0 1.思路 2.代码实现 三.前缀.中缀和后缀表达式规则 ...

  9. 计算机网络(中科大郑烇)第四章笔记

    文章目录 第四章 网络层:数据平面 1.导论 1.1 网络层:数据平面 1.2 网络层:数据平面.控制平面 1.3 网络层:控制平面 2.路由器组成 2.1 路由器结构概述 2.2 输入端口功能 2. ...

  10. 【算法图解】【读书笔记】

    第一章.算法简介 1.二分查找 说明:二分查找是一种算法,其输入一个有序的元素列表,如果要查找的元素包含在列表中,二分查找返回其位置,否则返回null. def binary_search(list0 ...

最新文章

  1. python编程语言是什么-Python是什么?可能是最受欢迎的编程语言
  2. Oracle的UNION函数
  3. 架设搭建开源搜索服务器 - Sphinx/Coreseek 安裝
  4. AWS Lambda事件源映射:使您的触发器混乱无序
  5. mysql分库一致性_分库分表带来的完整性和一致性问题
  6. 漫画 | 中断引发的面试教训
  7. Mysql中有哪些数据类型(建议收藏)
  8. ImageView的属性android:scaleType作用
  9. WinForm学习笔记(一)- 无边框窗体移动
  10. wordpress中文主题problog1.0发布,主打简洁,商务
  11. HDU 4731 Minimum palindrome 打表找规律
  12. wxFormBuilder + wxPython手撸丑陋计算器
  13. 使用记账软件 记录日常收支并将数据导出表格保存
  14. 服务器启动端口被占用,解决Nginx启动出现端口被占用的问题
  15. 净推荐值NPS(Net Promoter Score)
  16. 零基础搭建外卖优惠券返利CPS小程序教程
  17. webview 支付宝、微信支付 QQ登录
  18. CPU(中央处理器)和GPU(图像处理器)区别
  19. 【Appium】手机滑动swipe方法及如何进行坐标定位
  20. 在网易做游戏美术设计师是种什么体验?

热门文章

  1. config system丢失
  2. 2021王道考研pdf
  3. java 生成拼音首字母_java 根据汉字生成拼音全拼或拼音首字母的示例
  4. web打包app(h5+app)版本自动更新的实现
  5. Android实战开发--三种地图类型的设计
  6. 时序逻辑电路的设计与分析
  7. (QT学习笔记):QListWidget、QTreeWidget、 QTableWidget的基本使用
  8. Delphi各个版本的官方下载地址,还在等机会
  9. Head First设计模式整理
  10. har后缀文件怎么提取?