当前课程知识点:数据结构(上) >  第三章 列表 >  (e)插入排序 >  03E-8 逆序对

返回《数据结构(上)》慕课在线视频课程列表

03E-8 逆序对在线视频

03E-8 逆序对

下一节:03X D 习题辅导:LightHouse

返回《数据结构(上)》慕课在线视频列表

03E-8 逆序对课程教案、知识点、字幕

在结束这一节之前

我们再来讨论与插入排序非常相关

也是非常有意思的一个问题

我们来介绍这么样一个概念

也就是逆序对 inversion

对于任何一个序列

我们都可以在其中发现这种逆序对

既然是对 肯定就涉及到两个元素

没错

如果有某两个元素一左一右

而且左侧更大一些 右侧更小一些

我们就称它们构成了一个逆序对 一个inversion

当然反过来 如果是这样的顺序的

也就是左小右大的形式

这就不是个逆序对

当然你也可以称它叫作顺序对

实际上 在整体的n个元素中

任何两个元素都可能构成一个逆序对

因此 对于一个长度为n的序列而言

逆序对的总数有可能会多达n平方

那么inversion和我们这一节的主题

insertion sort是什么关系呢?

为了说明方便

我们先还要做一个铺垫的工作

我们看到inversion实际上

涉及到的是两个元素

这样不利于我们记帐

我们不妨采用一个统一的习惯 也就是

将每一个inversion都记入到后边

也就是靠右的那个元素的帐上去

因此我们只需要

在这种意义下 统计每一个元素

所对应的inversion有多少个

那么累计而言 就得到了

整个序列中所蕴含的逆序对的数目

再强调一遍 我们将每一个逆序对

都记到后者的帐上去

于是对于任何的一个节点p

我们都可以依此来定义

它所对应的逆序对的数目 记作i(p)

所有节点p所对应逆序对数的总和

也就是 整个序列所包含逆序对的总数

好了

回到插入排序的一般的场景

也就是说 如果当前有序的前缀为s

我们就要将无序后缀中的首元素

插入到这个前缀中的适当位置

正像我们此前所讲过的

这个对应的位置是一个切分点

在它之前 都是比待插入元素e

不大的元素

而反过来呢

在这个分界点之后的那些元素

都应该严格大于这个待插入的元素e

左边都不大于e 而右边都大于e

这说明什么呢?

这说明这个区间内的任何一个元素

都与待插入元素e构成了一个inversion

而且这个inversion正好能归入到

刚才我们记帐于p的那样一个统计值中

或者反过来讲

p所对应的inversion有多少个

p就需要经过多少次比较

才能抵达最终的插入位置

从这个意义上说

i(p)其实就是p所对应的查找长度

因此 如果我们将整个序列中

所包含的逆序对数 记作大I

那么这个大写的I

实际上 也就对应于插入排序算法

在一次又一次定位搜索过程中

比较次数的累计总和

而这个我们说过

就是这个算法所消耗时间的最主要部分

当然不要忘了还有另一部分

也就是对元素真正实施

插入操作所花费的时间

每个元素各自是1 累计是n

所以确切地讲

插入排序所需要的时间

应该是这两个量的总和

而刚才我们所分析的

最好情况和最坏情况呢

无非是它的特例

在最好情况下

我们讲过 它的复杂度是n

为什么是n呢?

回忆一下 最好情况

就是所有的元素都是顺序输入的

逐次递增

我们可以看到 在这样的一个序列中

根本就不含任何的逆序对

逆序对的总数是0

那么0加上n 当然也就是n了

反过来 再看最坏的情况

也就是 完全逆序输入的情况

这个时候我们说过

它的复杂度是n平方

为什么是n平方呢?

因为对于这样一种输入序列而言

其中任何一对元素都是逆序的

因此 它的逆序对的总数

当然也就等于

所有n个元素两两组合的总数

这个总数恰好就是n平方量级的

概括一下 从逆序对的角度来看

可以将插入排序算法的复杂度

度量为这样的一个结果

而这个结果向下可以很好的解释

并且对应于最好的情况

向上也可以很好的解释

并对应于最坏的情况

它是一个更一般的表示

也是一个更加本质的解释

就这样的意义而言

我们如果把刚才的逆序对总数

也就是I 作为序列无序程度的度量尺度

那么insertion sort

就可以理解为是

通过一次一次的努力

去修复这种无序性

原来有多无序 它就需要多少次修复

因此它的算法复杂度

其实不光是取决于问题的规模

而更多的是取决于

输入本身所具有的特性

也就是它的无序程度

所以这样一种算法

也称作输入敏感的

input-sensitive

在排序算法家族中

并非每一种算法都具有这样的一个特性

而插入排序 也正因为它具有这样一个特性

而显得非常的独特

在我们最终要介绍的希尔排序中

我们将会看到

这种特性对于希尔排序整体的性能

乃至这个算法的有效性

都是至关重要的

数据结构(上)课程列表:

第零章

-选课之前

--写在选课之前

--宣传片

-考核方式

--考核方式

-OJ系统说明

--关于OJ

--1-注册与登录

--2-界面与选课

--3-提交测试

-关于课程教材与讲义

--课程教材与讲义

-关于讨论区

--关于讨论区

-微信平台

--html

-PA晋级申请

--PA晋级

--MOOC --> THU 晋级申请专区

--THU --> CST 晋级申请专区

--编程作业不过瘾?且来清华试比高!

第一章 绪论(上)

-(a)计算

--01-A-1: 计算

--01a-2: 绳索计算机

--01a-3: 尺规计算机

--01a-4: 算法

--01a-5 : 有穷性

--演示

--01a-6 : 好算法

--(a)计算--作业

-(b)计算模型

--01b-1: 性能测度

--01b-2: 问题规模

--01b-3: 最坏情况

--01b-4: 理想模型

--01b-5: 图灵机

--01b-6: 图灵机实例

--01b-7: RAM模型

--01b-8: RAM实例

-(b)计算模型--作业

-(c)大O记号

--01c-1: 主流长远

--01c-2: 大O记号

--01c-3: 高效解

--01c-4 : 有效解

--01c-5 : 难解

--01c-6: 2−Subset

--01c-7: 增长速度

-(c)大O记号--作业

第一章 绪论(下)

-(d)算法分析

--01d-1: 算法分析

--01d-2: 级数

--01d-3: 循环

--01d-4: 实例:非极端元素+起泡排序

--01d-5: 正确性的证明

--01d-6: 封底估算-1

--01d-7: 封底估算-2

-(d)算法分析--作业

-(e)迭代与递归

--01-E-1: 迭代与递归

--01-E-2: 减而治之

--01-E-3: 递归跟踪

--01-E-4: 递推方程

--01-E-5: 数组倒置

--01-E-6: 分而治之

--01-E-7: 二分递归:数组求和

--01E-8 二分递归:Max2

--01E-09: Max2:二分递归

-(e)迭代与递归--作业

-(xc)动态规划

--01XC-1: 动态规划

--01XC-2: Fib():递推方程

--01XC-3: Fib():封底估算

--01XC-4: Fib():递归跟踪

--01XC-5: Fib():迭代

--01XC-6: 最长公共子序列

-- 演示

--01XC-7: LCS:递归

--01XC-8: LCS:理解

--01XC-9: LCS:复杂度

--01XC-A: LCS:动态规划

-(xc)动态规划--作业

-本章测验--作业

第二章 向量(上)

-(a)接口与实现

--02A-1 接口与实现

--02A-2 向量ADT

--02A-3 接口操作实例

--02A-4 构造与析构

--02A-5 复制

-(a)接口与实现--作业

-(b)可扩充向量

--02B-1 可扩充向量

--02B-2 动态空间管理

--02B-3 递增式扩容

--02B-4 加倍式扩容

--02B-5 分摊复杂度

-(b)可扩充向量--作业

-(c)无序向量

--02C-1 概述

--02C-2: 循秩访问

--02C-3 插入

--02C-4 区间删除

--02C-5 单元素删除

--02C-6 查找

--02C-7 唯一化

--02C-8 遍历

-(c)无序向量--作业

-(d1)有序向量:唯一化

--02D1-1 有序性

--02D1-2 唯一化(低效版)

--02D1-3 复杂度(低效版)

--02D1-4 唯一化(高效版)

--02D1-5 实例与分析(高效版)

-(d1)有序向量:唯一化--作业

-(d2)有序向量:二分查找

--02D2-1 概述

--02D2-2 接口

--02D2-3 语义

--02D2-4 原理

--02D2-5 实现

--02D2-6 实例

--02D2-7 查找长度

-(d2)有序向量:二分查找--作业

第二章 向量(下)

-(d3)有序向量:Fibonacci查找

--02D3-1 构思

--02D3-2 实现

--02D3-3 实例

--02D3-4 最优性

-(d3)有序向量:Fibonacci查找--作业

-(d4)有序向量:二分查找(改进)

--02D4-1 构思

--02D4-2 版本B

--02D4-3 语义

--02D4-4 版本C

--02D4-5 正确性

-(d4)有序向量:二分查找(改进)--作业

-(d5)有序向量:插值查找

--02D5-1 原理

--02D5-2 实例

--02D5-3 性能分析

--02D5-4 字宽折半

--02D5-5 综合对比

-第二章 向量(下)--(d5)有序向量:插值查找

-(e)起泡排序

--02 E-1 构思

--02E-2 改进

--02E-3 反例

--02E-4 再改进

--02E-5 综合评价

-(e)起泡排序--作业

-(f)归并排序

--02F-1 归并排序:构思

--02F-2 归并排序:主算法

--02F-3 二路归并:实例

--02F-4 二路归并:实现

--02F-5 二路归并:正确性

--02F-6 归并排序:性能分析

-(f)归并排序--作业

-本章测验--作业

第三章 列表

-(a)接口与实现

--03A-1 从静态到动态

--03A-2 从向量到列表

--03A-3 从秩到位置

--03A-4 实现

-(a)接口与实现--作业

-(b)无序列表

--03B-1 循秩访问

--03B-2 查找

--03B-3 插入与复制

--03B-4 删除与析构

--03B-5 唯一化

-(b)无序列表--作业

-(c)有序列表

--03C-1 唯一化·构思

--03C-2 唯一化·实现

--03C-3 查找

-(c)有序列表--作业

-(d)选择排序

--03D-1 构思

--03D-2 实例

--03D-3 实现

--03D-4 推敲

--03D-5 selectMax()

--03D-6 性能

-(d)选择排序--作业

-(e)插入排序

--03E-1 经验

--03E-2 构思

--03E-3 对比

--03E-4 实例

--03E-5 实现

--03E-6 性能分析

--03E-7 平均性能

--03E-8 逆序对

-(e)插入排序--作业

-(xd)习题辅导:LightHouse

--03X D 习题辅导:LightHouse

-本章测验--作业

第四章 栈与队列

- (a)栈接口与实现

--04A-1 栈

--04A-2 实例

--04A-3 实现

- (a)栈接口与实现--作业

-(c1)栈应用:进制转换

--04C1-1 应用

--04C1-2 算法

--04C1-3 实现

-第四章 栈与队列--(c1)栈应用:进制转换

-(c2)栈应用:括号匹配

--04C2-1 实例

--04C2-2 尝试

--04C2-3 构思

--04C2-4 实现

--04C2-5 反思

--04C2-6 拓展

-(c2)栈应用:括号匹配--作业

-(c3)栈应用:栈混洗

--04C3-1 混洗

--04C3-2 计数

--04C3-3 甄别

--04C3-4 算法

--04C3-5 括号

-第四章 栈与队列--(c3)栈应用:栈混洗

-(c4)栈应用:中缀表达式求值

--04C4-1 把玩

--04C4-2 构思

--04C4-3 实例

--04C4-4 算法框架

--04C4-5 算法细节

--04C4−6A 实例A

--04C4−6B 实例B

--04C4−6C 实例C

--04C4-6D 实例D

-(c4)栈应用:中缀表达式求值--作业

-(c5)栈应用:逆波兰表达式

--04C5-1 简化

--04C5-2 体验

--04C5-3 手工

--04C5-4 算法

-第四章 栈与队列--(c5)栈应用:逆波兰表达式

-(d)队列接口与实现

--04D-1 接口

--04D-2 实例

--04D-3 实现

-第四章 栈与队列--本章测验

第五章 二叉树

-(a)树

--05A-1 动机

--05A-2 应用

--05A-3 有根树

--05A-4 有序树

--05A-5 路径+环路

--05A-6 连通+无环

--05A-7 深度+层次

-(a)树--作业

-(b)树的表示

--05B-1 表示法

--05B-2 父亲

--05B-3 孩子

--05B-4 父亲+孩子

--05B-5 长子+兄弟

-第五章 二叉树--(b)树的表示

-(c)二叉树

--05C-1 二叉树

--05C-2 真二叉树

--05C-3 描述多叉树

-(c)二叉树--作业

-(d)二叉树实现

--05D-1 BinNode类

--05D-2 BinNode接口

--05D-3 BinTree类

--05D-4 高度更新

--05D-5 节点插入

-(d)二叉树实现--作业

-(e1)先序遍历

--05E1-1 转化策略

--05E1-2 遍历规则

--05E1-3 递归实现

--05E1-4 迭代实现(1)

--05E1-5 实例

--05E1-6 新思路

--05E1-7 新构思

--05E1-8 迭代实现(2)

--05E1-9 实例

-(e1)先序遍历--作业

-(e2)中序遍历

--05E2-1 递归

--05E2-2 观察

--05E2-3 思路

--05E2-4 构思

--05E2-5 实现

--05E2-6 实例

--05E2-7 分摊分析

-第五章 二叉树--(e2)中序遍历

-(e4)层次遍历

--05E4-1 次序

--05E4-2 实现

--05E4-3 实例

-第五章 二叉树--(e4)层次遍历

-(e5)重构

--05E5-1 遍历序列

--05E5-2 (先序|后序)+中序

--05E5-3 (先序+后序)x真

-(e5)重构--作业

-本章测验--作业

第六章 图

-(a)概述

--06A-1 邻接+关联

--06A-2 无向+有向

--06A-3 路径+环路

-(a)概述--作业

-(b1)邻接矩阵

--06B1-1 接口

--06B1-2 邻接矩阵+关联矩阵

--06B1-3 实例

--06B1-4 顶点和边

--06B1-5 邻接矩阵

--06B1-6 顶点静态操作

--06B1-7 边操作

--06B1-8 顶点动态操作

--06B1-9 综合评价

-(b1)邻接矩阵--作业

-(c)广度优先搜索

--06C-1 化繁为简

--06C-2 策略

--06C-3 实现

--06C-4 可能情况

--06C-5 实例

--06C-6 多连通

--06C-7 复杂度

--06C-8 最短路径

-(c)广度优先搜索--作业

-(d)深度优先搜索

--06D-1 算法

--06D-2 框架

--06D-3 细节

--06D-4 无向图

--06D-5 有向图

--06D-6 多可达域

--06D-7 嵌套引理

-(d)深度优先搜索--作业

-第六章 图--本章测验

03E-8 逆序对笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。