算法图解第四章笔记与习题(快速排序)
算法图解第四章笔记与习题(快速排序)
文章目录
- 算法图解第四章笔记与习题(快速排序)
- 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(nlogn)O(n\log n)O(nlogn),最糟情况为O(n2)O(n^2)O(n2)。这取决于基准值选取的好坏。
当每次基准值选取的均为最差情况时,则需要对包含nnn个元素的数组进行nnn次基准值的选取。当每次基准这选取的均为最佳情况时,则仅需要logn\log nlogn次选取。(二分)
而当每一次选取基准值后,数组的每个元素均需要和基准值进行对比,因此,每次选取基准值之后需要进行nnn次比较。
因此,快速排序的最糟情况为O(n∗n)=O(n2)O(n* n)=O(n^2)O(n∗n)=O(n2),平均情况为O(nlogn)O(n\log n)O(nlogn)。
4.4 小结
- 分而治之算法将问题逐步分解。使用分而治之算法处理列表时,基线条件很可能是空数组或只包含一个元素的数组。
- 实现快速排序时,请随机地选择用作基准值的元素。快速排序的平均运行时间为O(nlogn)O(n \log n)O(nlogn)。
- 大OOO表示法中的常量有时候事关重大,这就是快速排序比合并排序快的原因所在。
- 比较简单查找和二分查找时,常量几乎无关紧要,因为列表很长时,O(logn)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) 。
算法图解第四章笔记与习题(快速排序)相关推荐
- 算法图解第六章笔记与习题(广度优先搜索)
算法图解第六章笔记与习题(广度优先搜索) 文章目录 算法图解第六章笔记与习题(广度优先搜索) 6.1 图(graph) 6.2 广度优先搜索 6.3.1 查找最短路径 6.3.2 队列 6.4 实现图 ...
- 《学习JavaScript数据结构与算法》 第四章笔记 栈
文章目录 前言 一.栈? 二.构建两种栈的大致步骤 三.创建基于数组的栈 创建class Stack 定义用于操作栈的方法 使用栈 四.创建基于对象的栈 创建class Stack 定义用于操作栈的方 ...
- 《算法图解》第二章笔记与课后练习_选择排序算法
软件环境:Python 3.7.0b4 一.选择排序 # 找出数组中的最小元素 def findSmallest(arr):# 存储最小的值smallest = arr[0]# 存储最小元素的索引sm ...
- 算法图解第二章笔记与习题(选择排序)
算法图解第二章笔记与习题(选择排序) 文章目录 算法图解第二章笔记与习题(选择排序) 2.2 数组和链表 2.2.1 链表 2.2.2 数组 2.2.3 数组和链表的读取.插入和删除操作的时间复杂度 ...
- 机器学习实战 基于_机器学习实战:基于Scikit-Learn和TensorFlow—第四章笔记
机器学习实战:基于Scikit-Learn和TensorFlow---第四章笔记 一.学习目标 之前用了那么多的机器学习的模型,但是它们各自的训练算法在很大程度上还是一个黑匣子,我们对对系统内部的实现 ...
- 算法复习第四章动态规划
算法复习第四章动态规划 动态规划 TSP问题 0-1bag 动态规划 TSP问题 0-1bag 最长公共子序列不考:
- 《算法笔记》第四章笔记
<算法笔记>第四章 排序 排序算法的思想都比较简单,而且c++可以直接用sort函数进行排序,一般不会直接写排序代码 归根到底就是每轮处理一个数据,n个数据只需处理n-1次即可变得有序 选 ...
- 【Java数据结构与算法】第四章 栈实现综合计算器
第四章 栈实现综合计算器 文章目录 第四章 栈实现综合计算器 一.栈 1.介绍 2.应用场景 3.思路 4.代码实现 二.综合计算器 v1.0 1.思路 2.代码实现 三.前缀.中缀和后缀表达式规则 ...
- 计算机网络(中科大郑烇)第四章笔记
文章目录 第四章 网络层:数据平面 1.导论 1.1 网络层:数据平面 1.2 网络层:数据平面.控制平面 1.3 网络层:控制平面 2.路由器组成 2.1 路由器结构概述 2.2 输入端口功能 2. ...
- 【算法图解】【读书笔记】
第一章.算法简介 1.二分查找 说明:二分查找是一种算法,其输入一个有序的元素列表,如果要查找的元素包含在列表中,二分查找返回其位置,否则返回null. def binary_search(list0 ...
最新文章
- python编程语言是什么-Python是什么?可能是最受欢迎的编程语言
- Oracle的UNION函数
- 架设搭建开源搜索服务器 - Sphinx/Coreseek 安裝
- AWS Lambda事件源映射:使您的触发器混乱无序
- mysql分库一致性_分库分表带来的完整性和一致性问题
- 漫画 | 中断引发的面试教训
- Mysql中有哪些数据类型(建议收藏)
- ImageView的属性android:scaleType作用
- WinForm学习笔记(一)- 无边框窗体移动
- wordpress中文主题problog1.0发布,主打简洁,商务
- HDU 4731 Minimum palindrome 打表找规律
- wxFormBuilder + wxPython手撸丑陋计算器
- 使用记账软件 记录日常收支并将数据导出表格保存
- 服务器启动端口被占用,解决Nginx启动出现端口被占用的问题
- 净推荐值NPS(Net Promoter Score)
- 零基础搭建外卖优惠券返利CPS小程序教程
- webview 支付宝、微信支付 QQ登录
- CPU(中央处理器)和GPU(图像处理器)区别
- 【Appium】手机滑动swipe方法及如何进行坐标定位
- 在网易做游戏美术设计师是种什么体验?