This commit is contained in:
krahets
2023-04-10 03:12:02 +08:00
parent 2289822dfd
commit 867ecf6d92
32 changed files with 329 additions and 445 deletions
+14 -10
View File
@@ -4,10 +4,10 @@ comments: true
# 11.1.   排序简介
「排序算法 Sorting Algorithm」使列表中的所有元素按照从小到大的顺序排列。
「排序算法 Sorting Algorithm」使列表中的所有元素按照序排列。
- 待排序列表的 **元素类型** 可以是整数、浮点数、字符或字符串;
- 排序算法可根据需设定 **判断规则**,例如数字大小、字符 ASCII 码顺序自定义规则;
- 待排序列表的元素类型可以是整数、浮点数、字符或字符串
- 排序算法可根据需设定判断规则,如数字大小、字符 ASCII 码顺序自定义规则;
![排序中不同的元素类型和判断规则](intro_to_sort.assets/sorting_examples.png)
@@ -15,11 +15,13 @@ comments: true
## 11.1.1.   评价维度
**运行效率**:我们望排序算法的时间复杂度尽可能低,且总体操作数量少(即时间复杂度中的常数项低)。大数据量,运行效率尤为重要。
**运行效率**:我们望排序算法的时间复杂度尽低,且总体操作数量少(即时间复杂度中的常数项低)。对于大数据量情况,运行效率显得尤为重要。
**就地性**:顾名思义,「原地排序」直接在原数组上操作实现排序,而不用借助额外辅助数组,节约内存;并且一般情况下,原地排序的数据搬运操作较少,运行速度也更快。
**就地性**:顾名思义,「原地排序」通过在原数组上直接操作实现排序,无需借助额外辅助数组,从而节省内存。通常情况下,原地排序的数据搬运操作较少,运行速度也更快。
**稳定性**:「稳定排序」在完成排序后,相等元素在数组中的相对顺序 **不会发生改变**。假设我们有一个存储学生信息的表格,第 1, 2 列分别是姓名和年龄。那么在以下示例中,「非稳定排序」会导致输入数据的有序性丢失。稳定性是排序算法很好的特性,**在多级排序中是必须的**
**稳定性**:「稳定排序」在完成排序后,相等元素在数组中的相对顺序不发生改变。稳定排序是优良特性,也是多级排序场景的必要条件
假设我们有一个存储学生信息的表格,第 1, 2 列分别是姓名和年龄。在这种情况下,「非稳定排序」可能导致输入数据的有序性丧失。
```shell
# 输入数据是按照姓名排序好的
@@ -40,12 +42,14 @@ comments: true
('E', 23)
```
**自适应性**:「自适应排序」的时间复杂度受输入数据影响,即最佳、最差、平均时间复杂度不全部相等。自适应性也要分情况对待,若最差时间复杂度差于平均时间复杂度,代表排序算法会在某些数据下发生劣化,因此是负面性质;而若最佳时间复杂度优于平均时间复杂度,则是正面性质
**自适应性**:「自适应排序」的时间复杂度受输入数据影响,即最佳、最差、平均时间复杂度并不完全相等
**是否基于比较**:「比较排序」是根据比较算子($<$ , $=$ , $>$)来判断元素的相对顺序,进而排序整个数组,理论最优时间复杂度为 $O(n \log n)$ 。「非比较排序」不采用,时间复杂度可以达到 $O(n)$ ,但通用性相对较差
自适应性需要根据具体情况来评估。如果最差时间复杂度差于平均时间复杂度,说明排序算法在某些数据下性能可能劣化,因此被视为负面属性;而如果最佳时间复杂度优于平均时间复杂度,则被视为正面属性
**是否基于比较**:「基于比较的排序」依赖于比较运算符($<$ , $=$ , $>$)来判断元素的相对顺序,从而排序整个数组,理论最优时间复杂度为 $O(n \log n)$ 。而「非比较排序」不使用比较运算符,时间复杂度可达 $O(n)$ ,但其通用性相对较差。
## 11.1.2. &nbsp; 理想排序算法
**运行快、原地、稳定、正向自适应、通用性好**。显然,**目前没有发现具备以上所有特性的排序算法**,排序算法的选型使用取决于具体的数据特点问题特征
**运行快、原地、稳定、正向自适应、通用性好**。显然,迄今为止尚未发现兼具以上所有特性的排序算法。因此,在选择排序算法时,需要根据具体的数据特点问题需求来决定
接下来,我们将一起学习各种排序算法,并基于上评价维度展开分析各个排序算法的优缺点。
接下来,我们将共同学习各种排序算法,并基于上评价维度各个排序算法的优缺点进行分析