当前课程知识点:数据结构(上) > 第三章 列表 > (d)选择排序 > 03D-4 推敲
现在我们重新来审视一遍这个算法
并且对其中的几个细节来做一推敲
第一个问题是 大家注意到
我们在这里套用了此前所实现的
remove和insert
这样一些标准的操作接口
从整个代码实现的简洁性来说
这不失为一种好办法
但是我们要指出的是
从效率而言 还是值得推敲的
这其中的原因在于
如果我们回顾一下 就会记得起来
这两个操作都要使用到动态空间分配
也就是insert的时候
我们必须要用new
remove的时候我们需要delete
请注意 虽然这两个操作
都可以大致认为
依然是常数的时间复杂度
但是从实际的时间消耗而言
它大致是我们通常的基本操作的一百倍
也就是说 要高出两个数量级
因此在实际中
这一对操作应该尽可能少的使用
就这个意义而言
貌似简明的这句
或许应该改用另外一种实现方式
比如说 或许我们可以
只通过对这里
和这里两处局部引用的修改
来实现同样的功能
另外一种可行的方式就是
只需将M与T当前的前驱
直接交换它们的数据域即可
再来讨论一个更为有意思的问题
细心的同学可能已经观察到
有些情况下
这样一个对M的搬动操作
其实是不必进行的
如果我们所找到的这个最大节点M
恰好正是tail的直接前驱
那么它自然已经就位
当然也就无需搬动了
没错
的确有这种可能
那么基于这样一种观察
或许你会倾向于去做这样一种优化
也就是说
如果经过刚才的那样一个判断
我们在此忽略掉
留给大家来填空完成
能够判断出M确实
就是T当前的直接前驱
那么我们就可以省略掉这样一次移动操作
或者反过来说
只有当这个条件不成立的时候
我们才会真正地去执行这一句
这样一种改进的方式 本身的确是可行的
但是我们并不认为这是一个优化
其中的原因在于
在通常的随机分布下
这种情况出现的概率极低
以致于我们这里所做的
这种所谓的优化会得不偿失
对此有兴趣的同学
可以去阅读我们的习题解析
并且完成其中的3-14题
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验