1、分类
排序算法主要可根据 稳定性 、就地性 、自适应性 分类。理想的排序算法具有以下特性:
- 具有稳定性,即相等元素的相对位置不变化;
「稳定排序」在完成排序后,不改变 相等元素在数组中的相对顺序。例如:冒泡排序、插入排序、归并排序、基数排序、桶排序。
「非稳定排序」在完成排序后,相等素在数组中的相对位置 可能被改变。例如:选择排序、快速排序、堆排序。
具有就地性,即不使用额外的辅助空间;排序算法可分为「原地排序」和「异地排序」两类。
一般地,由于不使用外部内存,原地排序相比非原地排序的执行效率更高。「原地排序」不使用额外辅助数组,例如:冒泡排序、插入排序、选择排序、快速排序、堆排序。
「非原地排序」使用额外辅助数组,例如:归并排序、基数排序、桶排序。具有自适应性,即时间复杂度受元素分布影响;
「自适应排序」的时间复杂度受元素分布影响;例如:冒泡排序、插入排序、快速排序、桶排序。
「非自适应排序」的时间复杂度恒定;例如:选择排序、归并排序、堆排序、基数排序。
比较类排序:基于元素之间的 比较算子(小于、相等、大于)来决定元素的相对顺序;相对的,非比较排序则不基于比较算子实现。
「比较类排序」基于元素之间的比较完成排序,例如:冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序。
「非比较类排序」不基于元素之间的比较完成排序,例如:基数排序、桶排序。
基于比较的排序算法的平均时间复杂度最优为 O(NlogN),而非比较排序算法可以达到线性级别的时间复杂度。
特别地,任意排序算法都 不同时具有以上所有特性 。
因此,排序算法的选型使用取决于具体的列表类型、元素数量、元素分布情况等应用场景特点。
2、时间复杂度,空间复杂度