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

目录

算法概述

物理排序

复杂度分析


算法概述

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

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

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

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


  • 定义一个指针数组作为"表"(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数据结构------陈越、何钦铭

相关推荐
萧西待水6 小时前
奥赛一本通 1447 靶形数独
算法·深度优先
梦帮科技8 小时前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
泯泷8 小时前
那段文字是谁删的?Yjs 14 正式版之前,一套删除归属方案的实现与边界
前端·javascript·算法
hold?fish:palm8 小时前
34 合并K个升序链表
javascript·算法·链表
一只路人甲9 小时前
使用AI快速学习
学习
C++ 老炮儿的技术栈9 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
传奇开心果编程9 小时前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
Navigator_Z10 小时前
LeetCode //C - 1252. Cells with Odd Values in a Matrix
c语言·算法·leetcode
边境悍匪12 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
Gyr012 小时前
浅刷了一遍51CTO软考题库客观题及其解析(4)
学习·软考·知识点·信息安全工程师