当前课程知识点:数据结构(上) > 第二章 向量(下) > (e)起泡排序 > 02E-2 改进
对于当前区间lo和hi之间的
每一对相邻元素
这里与此前的基本版本一样
也需要做一个比对
如果像这个if条件所判断的那样
它们是逆序的
我们就将二者交换位置
这个新的版本不同的关键之处在于
我们这里提供了一个标志
记录这个if判断语句曾经成立过
这个标志的初值设为true
而它的命名和它的语义
恰好是吻合的 sorted 有序的
我们这里类似于无罪推论
首先认为它是不存在无序元素的
也就是整体是有序的
接下来 一旦发现一对逆序的元素
随即将它标志为false
按照这样的一个逻辑
在最终返回sorted的时候
它就恰好反映了
在此前的这趟扫描过程中
是否曾经发现过逆序元素
或等价地 当前这个区间
是否已经完全有序了
而这个标志将在主程序中
作为while循环的控制条件
在sorted返回true的时候
这个因为取了非
while的继续条件不再满足
从而及时地终止 节省时间
这种改进在时间成本上的体现
可以用这样一幅图来表示
在此前原始的版本中 是机械的
从头到尾执行各次扫描交换
它所需要的时间
可以认为由一趟扫描交换
接着另一趟扫描交换
以及再接着一趟扫描交换
持续进行 直到最终一个不漏
整体运行时间确实可以度量为
一个三角形的面积
那么新的这个算法呢?
它固然要做第一趟扫描交换
也许还需要进行一次扫描交换
也许还会进行若干次扫描交换
但是正像我们刚才所说的
在某些情况下
它有可能会发现
不光此后的部分已经有序了
而且这个前缀也已经完全有序了
所以在这个时候
它会及时地跳转到最后
聪明地绕过这些
完全可以绕过的计算量
因此与刚才那样对比
新的这个算法所执行的计算量
可以度量为这样一个梯形
而不是原来的三角形
也就是说 很多情况下
我们都可以节省一定的
甚至是相当多的时间
不过我们对这个算法的改进
并不满足于此
因为我们发现在一些其它
或者说在更多的情况下
这个算法依然存在继续改进的空间
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验