当前课程知识点:数据结构(上) > 第二章 向量(下) > (e)起泡排序 > 02E-3 反例
为此我们来看这样一个实例
考察某一个向量
假设这个向量可以分为
长度相差悬殊的
一个前缀以及后缀
而且后缀中的元素
都已按顺序排列
并严格地就位
当然相应地 所有的乱序元素
都集中分布于这样一个
相对更短的前缀中
对于这样的一个实例
刚才我们已经做过
优化的起泡排序算法
会如何表现呢?
首先它需要做第一趟
忠实地扫描交换
并且确认在最后这个位置
有一个元素就位
虽然它原本就是就位的
请注意虽然这个时候
在我们这个后缀中
存在着大量的就位元素
但因为在前缀中
刚才存在交换
bubble算法会返回false
也就是说 算法接下来还会继续下去
尽管能够判定的
就位元素数目会继续增加
但是与刚才同理
我们依然不能确认可以提前退出
也就是说 接下来还需要进行
一次以及再一次、若干次的扫描交换
那么对于这样的一个例子
总体而言 需要多少趟扫描交换?
我们说 扫描交换的趟数
不会超过这个前缀的长度r
为什么呢?
因为此前所做的各趟扫描交换
与其说 是在对绿色的范围做处理
不如说实际影响的是
这个前缀中的倒数第一个
倒数第二个 以及倒数第三个
也就是说
是在这个前缀中的后缀中的那些元素
的确 我们每一趟扫描交换
所起的实质作用
无非是在这样一个前缀中
令一个一个的后缀元素依次就位
直到整个这个前缀中的元素完全就位
因此这个算法总体消耗的时间
应该是n乘以r
如果r取作根号n
相应地 也就是n的1.5次方
问题是我们如果能有一种技巧
及时地检测出这样一种情况
也就是说 实质需要排序的元素
集中在一个宽度仅为根号n的区间中
而不是整个向量
那么即使套用最原始的起泡排序算法
所需要的时间也无非是
根号n的平方等于O(n)
我们的问题是如何才能够
完成从1.5次方
到一次方的优化转换呢?
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验