目录
0. 排序方法分类
按存储介质分
按比较器个数分
按比较时主要操作分
按是否需要辅助空间
按排序稳定性分
按排序的自然性分
接下来的排序都建立在顺序存储结构的基础上,定义如下:
1. 直接插入排序
类似抓一张牌,排一次序,边插入边排序
不断重复以下操作:
插入排序根据插入位置的定位方法,可以分为多种:
顺序比较法——不使用哨兵
1. 需要一个额外空间[x]存储元素
2. for每一次循环需要做两次判断
顺序比较法——使用哨兵
伪代码
性能分析
- 时间复杂度为O(n²),空间复杂度为O(1);
- 直接插入属于自然排序,与原始序列顺序有关;
- 直接插入属于稳定排序。
顺序比较法——使用哨兵,使用折半查找
伪代码
性能分析
- 时间复杂度仍为O(n²),空间复杂度为O(1);
- 折半插入绝大多数情况性能优于直接顺序插入(减少了比较次数,未减少移动次数),原序列的有序性越强,越适合用直接插入;
- 折半插入属于非自然排序,仅与序列元素个数有关;
- 折半插入属于稳定排序。
2. 希尔排序
思路
例:
伪代码
和普通直接插入排序很相似,但比较间隔由“1”改为了步长“dk”。
特点
性能分析
- 时间复杂度为O(n的1.25次方左右),空间复杂度为O(1);
- 增量序列中,其它数不能有除了1以外的公因子(不然会破坏其它数已经排好的序列);
- 不宜在链式存储结构上使用
- 希尔排序属于自然排序;
- 希尔排序属于不稳定排序。
时间效率与增量序列的选择直接相关,但具体是多少数学上还没有证明,只有猜想值。