This commit is contained in:
krahets 2023-03-27 15:08:48 +08:00
parent d991fbf326
commit f3e3204278

View file

@ -15,14 +15,11 @@ comments: true
## 11.1.1.   评价维度 ## 11.1.1.   评价维度
排序算法主要可根据 **稳定性 、就地性 、自适应性 、比较类** 来分类 **运行效率**:我们希望排序算法的时间复杂度尽可能低,并且总体操作数量更少(即时间复杂度中的常数项更低)。在大数据量下,运行效率尤为重要
### 稳定性 **就地性**:顾名思义,「原地排序」直接在原数组上操作实现排序,而不用借助额外辅助数组,节约内存;并且一般情况下,原地排序的数据搬运操作较少,运行速度也更快。
- 「稳定排序」在完成排序后,**不改变** 相等元素在数组中的相对顺序。 **稳定性**:「稳定排序」在完成排序后,相等元素在数组中的相对顺序 **不会发生改变**。假设我们有一个存储学生信息的表格,第 1, 2 列分别是姓名和年龄。那么在以下示例中,「非稳定排序」会导致输入数据的有序性丢失。稳定性是排序算法很好的特性,**在多级排序中是必须的**。
- 「非稳定排序」在完成排序后,相等元素在数组中的相对位置 **可能被改变**
假设我们有一个存储学生信息的表格,第 1, 2 列分别是姓名和年龄。那么在以下示例中,「非稳定排序」会导致输入数据的有序性丢失。因此「稳定排序」是很好的特性,**在多级排序中是必须的**。
```shell ```shell
# 输入数据是按照姓名排序好的 # 输入数据是按照姓名排序好的
@ -43,32 +40,12 @@ comments: true
('E', 23) ('E', 23)
``` ```
### 就地性 **自适应性**:「自适应排序」的时间复杂度受输入数据影响,即最佳、最差、平均时间复杂度不全部相等。自适应性也要分情况对待,若最差时间复杂度差于平均时间复杂度,代表排序算法会在某些数据下发生劣化,因此是负面性质;而若最佳时间复杂度优于平均时间复杂度,则是正面性质。
- 「原地排序」无需辅助数据,不使用额外空间; **是否基于比较**:「比较排序」是根据比较算子($<$ , $=$ , $>$)来判断元素的相对顺序,进而排序整个数组,理论最优时间复杂度为 $O(n \log n)$ 。「非比较排序」不采用,时间复杂度可以达到 $O(n)$ ,但通用性相对较差。
- 「非原地排序」需要借助辅助数据,使用额外空间;
「原地排序」不使用额外空间,可以节约内存;并且一般情况下,由于数据操作减少,原地排序的运行效率也更高。
### 自适应性
- 「自适应排序」的时间复杂度受输入数据影响,即最佳 / 最差 / 平均时间复杂度不相等。
- 「非自适应排序」的时间复杂度恒定,与输入数据无关。
我们希望 **最差 = 平均**,即不希望排序算法的运行效率在某些输入数据下发生劣化。
### 比较类
- 「比较类排序」基于元素之间的比较算子(小于、相等、大于)来决定元素的相对顺序。
- 「非比较类排序」不基于元素之间的比较算子来决定元素的相对顺序。
「比较类排序」的时间复杂度最优为 $O(n \log n)$ ;而「非比较类排序」可以达到 $O(n)$ 的时间复杂度,但通用性较差。
## 11.1.2. &nbsp; 理想排序算法 ## 11.1.2. &nbsp; 理想排序算法
- **运行快**,即时间复杂度低; **运行快、原地、稳定、正向自适应、通用性好**。显然,**目前没有发现具备以上所有特性的排序算法**,排序算法的选型使用取决于具体的数据特点与问题特征。
- **稳定排序**,即排序后相等元素的相对位置不变化;
- **原地排序**,即运行中不使用额外的辅助空间;
- **正向自适应性**,即算法的运行效率不会在某些输入数据下发生劣化;
然而,**没有排序算法同时具备以上所有特性**。排序算法的选型使用取决于具体的列表类型、列表长度、元素分布等因素 接下来,我们将一起学习各种排序算法,并基于以上评价维度展开分析各个排序算法的优缺点。