7大比较排序算法 | 时间复杂度 | 空间复杂度 | 特殊情况下的优化 | 应用 |
---|---|---|---|---|
选择排序 | O(n^2) | O(1) | \ | \ |
插入排序 | O(n^2) | O(1) | 完全有序数组,O(n) | \ |
冒泡排序 | O(n^2) | O(1) | 完全有序数组,O(n) | \ |
归并排序 | O(nlogn) | O(n) | 完全有序数组,O(n) | 求解数组中逆序对个数 |
快速排序 | O(nlogn)* | O(1) | 元素相同数组,O(n) | 求解SelectK、TopK问题 |
堆排序 | O(nlogn) | O(1) | \ | 优先队列求解SelectK、TopK问题 |
希尔排序 | O(nlogn)—O(n^2) | O(1) | \ | 分组的思想 |
*代表随机算法,其时间复杂度为期望复杂度
对于有多个属性的元素,当基于某一种属性排序时,如果这个属性相等,那排序后相对位置一定不变,即另一种属性的顺序也不变
因此,如果排序过程中相同的元素会发生“跳跃”的话,就是不稳定
7大比较排序算法 | 算法稳定性 | 原因 |
---|---|---|
选择排序 | 不稳定 | 元素交换位置的时候,会发生“跳跃” |
插入排序 | 稳定 | 元素移动,不会发生“跳跃” |
冒泡排序 | 稳定 | 只比较相邻的元素,不会发生“跳跃” |
归并排序 | 稳定 | 归并时优先选择前面的元素,不会发生“跳跃” |
快速排序 | 不稳定 | 随机选择标定点,会发生“跳跃” |
堆排序 | 不稳定 | 二叉树交换元素,会发生“跳跃” |
希尔排序 | 不稳定 | 分组后不同组的元素会发生“跳跃” |
如果在具体的类中,明确定义了多个属性排序的规则,那么也就不需要考虑排序算法的稳定性了
例如当score相等时,指定按照name进行排序,相对位置就不会发生改变
@Override public int compareTo(Student another){ if (another.score != this.score){ return another.score - this.score; } else { return this.name.compareTo(another.name); } }