排序总结
1. 概述
基于比较
- 插入:直接插入 / 希尔
- 交换:冒泡 / 快排
- 选择:堆排序
- 归并
2. 插入
直接插入
特点:稳定,就地,平均,最好情况(初始有序)下
思想:数组被分成两个部分,一个有序一个无序,依次将无序中的元素插入有序部分。
数据若基本有序,插入排序可以大大减少数据交换次数,提升效率。
希尔排序
特点:非稳定,就地, (1 < λ < 2)
思想:先将序列按增量划分为元素个数近似的若干组,使用直接插入排序法对每组进行排序,不断缩小增量并排序,直到增量为1。
因为增量初始值不容易选择,所以该算法不常用。
3. 交换
冒泡排序
特点:稳定,就地,平均 ,最好(初始有序)
思想:数组被分成两个部分,一个有序一个无序,不断将较大元素冒泡到无序子序列首。
若某趟冒泡未发生交换,说明数组已经有序,可提前结束。
快速排序
特点:不稳定,就地,平均 ,最差情况(每次 partition 后 pivot 在最前或最后)
思想:每次选定一个 pivot 将数组分割成两个部分,对二者递归应用这个过程。
3. 选择
堆排序
特点:不稳定,就地,始终
思想: 数组建大根堆,不停地 remove 第一个元素放到最后,并重新调整堆。
4. 其他
归并排序
特点:稳定,非就地,时间始终是 ,空间
思想:首先,将整个序列(共N个元素)看成N个有序子序列,然后依次合并相邻的两个子序列,这样一直下去,直至变成一个整体有序的序列。
适用场景:外部排序
5. 总结
大部分简单排序(直接插入排序 / 冒泡排序)都是稳定排序;
大部分高级排序都是不稳定排序,除了 归并排序。