当前课程知识点:数据结构(上) > 第二章 向量(下) > (e)起泡排序 > 02E-5 综合评价
我们来对起泡排序的各个版本
做一个综合的评价
并且做一些延伸的讨论
首先就效率而言 我们明确一点
无论是第一章所介绍的算法
还是这里介绍的两个通用版本
它们在最好情况和最坏情况的性能
其实都是一样的
差异只在于对一般情况而言
或者说最好的情况出现的概率
或者是比例 各自有所区别
另外一个我们需要考虑的
也是我们此后在此类算法中
非常注重的一个方面
就是所谓的stability
算法的稳定性
这是对诸如排序算法之类
算法的一个更为细致的要求
什么叫稳定性呢?
这个问题涉及的是
向量中的重复元素
就我们这里的这个例子而言
在其中可能存在三个重复的元素
三个7
我们为了以示区别
分别用下标abc来做标识
那么在经过排序之后
从基本的要求来看
只要是三个7连续地排列就可以了
但是我们说 这三个7
分别是原来的哪一个7
实际上是有讲究的
在很多算法里头
实际上是非常敏感的
如果输出的结果中
雷同的这些元素
能够保持它们此前的相对次序
比如说 像这里的abc依然保持是abc
那么我们就称这个算法
stable 是稳定的
否则的话 如果不能保证
总是保持这种相对的次序 像这样
我们就称它unstable
是非稳定的 不稳定的
那么 以上的起泡排序算法
是稳定的吗?
我们说是的
原因在哪儿呢?
如果仔细观察一下刚才介绍的
那些起泡排序的版本的话
我们都会发现这样一个规律
也就是说 其中任何两个元素
a和b 一般而言
如果它们的相对位置要发生变化的话
那么只可能是这样一种场景
也就是说
在经过连续地若干次交换的过程中
它们会从彼此有一定的距离
而逐渐地相互靠拢
直到在某一个临界的时刻
二者会变成相互紧邻
那么这个场景 接下来也是必然的
因为它们有可能是逆序的
所以在紧接着下来的那一趟扫描交换过程中
它们必然会被检测出来
而且必然会随之交换彼此的位置
这是任意两个元素在起泡排序中
能够交换位置的唯一场景
前面这步 可以说是一个铺垫
而这一步才是实质地二者交换位置
那么在我们这样的一个算法中
交换位置的条件是什么呢?
大家如果回过去看的话
我们会发现 在if语句中
lo-1和lo这两个相邻元素
如果要发生交换的话
条件是 前者是严格地大于后者
也就是说 它们是严格地逆序的
所以如果这两个7
比如说7a和7b
即使它们能够彼此靠拢
直到它们变成紧邻
那根据这样的一个交换条件
它们也是不可能彼此交换的
虽然起泡排序可以做大量的改进
但从最坏情况而言
它依然是注定也需要O(n^2)的时间
所以我们非常希望能够得到一个
即便在最坏情况下
也能够效率更高的排序算法
这也是我们下一节所要介绍的内容
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验