以下是七种经典排序算法及其稳定性的详细说明:
一、直接插入排序
稳定性:稳定
说明:
直接插入排序通过将元素逐个插入已排序序列的正确位置,且插入时若遇到相等元素,会保持原有顺序不变。例如,在插入过程中,若发现已排序部分存在与当前元素相等的值,新元素会被插入到这些相等元素的右侧,因此不会破坏稳定性。
二、希尔排序
稳定性:不稳定
说明:
希尔排序是对直接插入排序的改进,通过分组插入排序。由于分组后元素可能跨越多个位置移动,导致相同元素的相对顺序被打破。例如,若两个相等的元素被分到不同组,排序后它们的相对位置可能改变。
三、冒泡排序
稳定性:稳定
说明:
冒泡排序通过相邻元素比较和交换实现排序。若相邻元素相等则不会交换,因此相等元素的相对顺序保持不变。例如,序列 [5, 2, 2, 3]
排序后仍保持两个 2
的原始顺序。
四、快速排序
稳定性:不稳定
说明:
快速排序的分区操作可能导致相同元素的位置变化。例如,选择基准元素时,若将右侧的相等元素交换到左侧,会破坏稳定性。此外,递归过程中元素多次交换也会影响顺序。
五、直接选择排序
稳定性:不稳定
说明:
直接选择排序在每轮选择最小值时,可能将后续的相等元素提前到前面。例如,序列 [3A, 2, 3B, 1]
排序后可能变为 [1, 2, 3B, 3A]
,导致相同元素 3A
和 3B
的相对顺序改变。
六、堆排序
稳定性:不稳定
说明:
堆排序在构建最大堆或最小堆时,父子节点的交换可能打乱相同元素的顺序。例如,若父节点与子节点值相等,但子节点位于右侧,调整堆结构时可能导致右侧元素被交换到左侧。
七、基数排序
稳定性:稳定
说明:
基数排序按位分配元素到桶中,再按顺序收集。例如,按个位排序后,十位排序时若两个元素的十位相同,则个位较小的元素仍保持在前,因此稳定性得以保留。
稳定性对比表
排序算法 | 稳定性 | 关键原因 |
---|---|---|
直接插入排序 | 稳定 | 插入时保持相等元素的相对顺序 |
希尔排序 | 不稳定 | 分组插入导致跨越移动 |
冒泡排序 | 稳定 | 相邻相等元素不交换 |
快速排序 | 不稳定 | 分区操作和递归交换破坏顺序 |
直接选择排序 | 不稳定 | 选择最小值时可能交换后续相等元素 |
堆排序 | 不稳定 | 堆调整时父子节点交换破坏顺序 |
基数排序 | 稳定 | 按位分配和收集时保留原始顺序 |
关键补充
- 稳定性定义:若排序后相等元素的相对位置与原始序列一致,则为稳定排序,否则为不稳定。
- 应用场景:
- 稳定算法适合需要保留原始顺序的场景(如按多字段排序)。
- 不稳定算法在数据规模大或对稳定性无要求时效率更高。
如需进一步了解具体算法步骤或代码实现,可参考对应文献。
评论区