当前课程知识点:数据结构(上) > 第三章 列表 > (d)选择排序 > 03D-5 selectMax()
至此我们只剩最后一个细节 未作交待
也就是如何从一个指定的区间中
挑选出最大的那个节点
对于列表L而言
我们考察的是一个一般性的区间
这个区间的起点
是以节点p来指示的
而这个区间的长度呢 是n
所以同样地
我们可以假想着 在这个位置
有一个尾部的哨兵
我们的算法朴素无华
具体来讲就是 我们要从首节点出发
逐一地进行比对
并且在这样的一个过程中
记录下当前最大的元素
当我们抵达终点时
这个最终的记录
就是我们所要找的最大节点
这样一个思路可以兑现为这几行代码
这个selectMax接口
要准备一个名为max的变量
用以记录当前所能够找到的最大节点
而整个过程呢
是一个for循环形式的迭代
当前的节点由cur来指示
而每经过一步迭代
cur都会转向它的后继
由此完成对整个区间中
各个节点的遍历
而对于每一个当前的节点
我们都会取出它的数据域
并且与目前号称为max的
这个节点的数据域作一比较
如果前者反而不小
我们就将max更新为
这个不小的新节点
所以在整个迭代的过程中
max只可能逐次地递增
而绝对不会下降
这样一种算法称作画家算法
painter's algorithm
原因在于 整个这样的一个过程
非常像油画家画画的过程
在一张画布上
你可能会堆积上不同的颜色
而最终这个位置所体现出的颜色
是由最后那一笔油彩所决定的
我们这个过程也是如此
对max的每一次更新
都犹如是在这块画布上
涂上了一层新的颜色
最终所获得的那个最大值
其实就是最后一次更新的那个元素
这个过程和画家画油画完全类似
你可能已经注意到
我们这里所采用的比较器是
not less than 也就是不小于
换而言之
只要当前的这个节点
大于或等于目前的max
我们就需要做相应的更新
就像重新地涂上一层新的油彩一样
之所以采用这样一种方式
是因为我们这里需要
对重复元素进行适当的处理
根据这样一个比较器 不难理解
如果这个序列中存在重复的元素
比如说 对于当前的max来说
可能会有多个
那么这样一种实现方式的好处就是
它会最终选取其中最靠后的那个
而这个元素也相应地
会被优先地转移到sorted的那部分
就总体效果而言 所有的这些重复元素
都会依次地转移到相应的位置上去
从而保证算法的稳定性
作为对比 你可以考虑一下
如果将这个比较器换成
严格的大小比较
比如说 greater than 会怎么样?
我们把这个作为你在课后的思考题
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验