数据结构和算法——表排序(算法概述、物理排序、复杂度分析,包含详细清晰图示过程)

目录

算法概述

物理排序

复杂度分析


算法概述

表排序用于 待排元素都为一个庞大的结构,而不是一个简单的数字,例如:一本书,一部电影等等。

如果这些待排元素都用之前的排序方法,元素需要频繁互换,那么移动这些元素的时间将会非常长久,效率很低。

在表排序的过程中,实际上是不需要移动那些原始数据的,要移动的只是指向他们位置的那些指针。

不移动元素本身,而只移动元素本身的排序方法,我们称之为"间接排序"。


  • 定义一个指针数组作为"表"(table)

|-----------|-----------|-----------|-----------|-----------|-----------|
| A | [0] | [1] | [2] | [3] | [4] |
| key | e | a | c | b | d |
| table | 0 | 1 | 2 | 3 | 4 |

结合插入排序来看一下表排序的间接排序 :

|-----------|-----------|-----------|-----------|-----------|-----------|
| A | [0] | [1] | [2] | [3] | [4] |
| key | e | a | c | b | d |
| table | 1 | 0 | 2 | 3 | 4 |

比较e和a,发现a比e小,所以a应该要插入到e的前面。但是我们不直接交换元素,而是交换table。

插入c,并与前面的a和e作比较,按照一般的插入排序来看,应该是这样的:

所以就可以直观地看出c应该放在哪个位置了,所以这一趟表排序的结果为:

|-----------|-----------|-----------|-----------|-----------|-----------|
| A | [0] | [1] | [2] | [3] | [4] |
| key | e | a | c | b | d |
| table | 1 | 2 | 0 | 3 | 4 |

接下来重复操作,插入b,对应正常的插入排序为:

表排序的结果为:

|-----------|-----------|-----------|-----------|-----------|-----------|
| A | [0] | [1] | [2] | [3] | [4] |
| key | e | a | c | b | d |
| table | 1 | 3 | 2 | 0 | 4 |

最后插入d,得到最终表排序间接排序的结果:

|-----------|-----------|-----------|-----------|-----------|-----------|
| A | [0] | [1] | [2] | [3] | [4] |
| key | e | a | c | b | d |
| table | 1 | 3 | 2 | 4 | 0 |

这样就得到了一个有序的序列了,即A[ 0 ] = A[ table[0] ] = a , A[ 1 ] = A[ table[1] ] = b......

如果仅要求按顺序输出,则可以输出:

A[ table[0] ],A[ table[1] ],A[ table[2] ],......,A[ table[N-1] ]

物理排序

如果完成了表排序的间接排序之后,仍然需要对原始数据进行移动排序的话,就要用到物理排序了。

而物理排序用到了一个很重要的原理:N个数字的排列由若干个独立的环组成

我们依据上面的例子,

|-----------|-----------|-----------|-----------|-----------|-----------|
| A | [0] | [1] | [2] | [3] | [4] |
| key | e | a | c | b | d |
| table | 1 | 3 | 2 | 4 | 0 |

找出它的环:

如此,table1 3 4 0为一个环;2则单独为一个环。

于是现在就可以开始我们的物理排序了:

复杂度分析

  • 最好情况:初始即有序
  • 最坏情况:
  • 有 N/2 个环,每个环包含2个元素
  • 需要 3N/2 次元素移动 (3N是指交换两个需要三次的移动操作)

,m 是每个A元素的复制时间,这个复制时间一般是比较大的常数,不能省略。


end


学习自:MOOC数据结构------陈越、何钦铭

相关推荐
im_AMBER24 分钟前
算法笔记 05
笔记·算法·哈希算法
夏鹏今天学习了吗30 分钟前
【LeetCode热题100(46/100)】从前序与中序遍历序列构造二叉树
算法·leetcode·职场和发展
吃着火锅x唱着歌30 分钟前
LeetCode 2389.和有限的最长子序列
算法·leetcode·职场和发展
嶔某43 分钟前
二叉树的前中后序遍历(迭代)
算法
WWZZ20251 小时前
快速上手大模型:机器学习2(一元线性回归、代价函数、梯度下降法)
人工智能·算法·机器学习·计算机视觉·机器人·大模型·slam
孤狼灬笑1 小时前
深度学习经典分类(算法分析与案例)
rnn·深度学习·算法·cnn·生成模型·fnn
dragoooon341 小时前
[优选算法专题四.前缀和——NO.26二维前缀和]
算法
Element_南笙1 小时前
吴恩达新课程:Agentic AI(笔记2)
数据库·人工智能·笔记·python·深度学习·ui·自然语言处理
koo3642 小时前
李宏毅机器学习笔记21-26周汇总
人工智能·笔记·机器学习
苏小瀚2 小时前
算法---位运算
java·算法