内容参考:《数据结构》(C语言版 _严蔚敏 吴伟民 )
一、插入排序
1、基本思想
每步将一个待排序的记录按其关键字大小插入到前面已经排好序的一组记录的适当位置上,直到记录全部有序为止。
即所说的:边插入边排序,保证子序列中随时都是有序的。
2、插入排序的主要算法
1. 直接插入排序
2. 折半插入排序
3. 希尔排序
以下将要介绍的是直接插入排序
二、直接插入排序
直接插入排序(Straight Insertion Sort),是一种最简单的排序方法。
1、基本操作
将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。
2、示例
例如,已知待排序的一组记录的初始排列如下所示:
49 , 38 , 65 , 97 , 76 , 13 , 27 , 49
( 从小到大排序)
如上图所示,得到一组新的有序序列:
13 , 27 , 38 , 49 , 49 , 65 , 76 , 97
3、算法
void InsertSort( SqList &L){
//对顺序表L作直接插入排序。
for(i=2;i<=L.length;++i)
if(LT(L.r[i].key,L.r[i-1].key)){
//“<”,需将L.r[i]插入有序子表
L.r[0]=L.r[i]; //复制为哨兵
L.r[i]=L.r[i+1];
for(j=i-2; LT(L.r[0].key,L.r[j].key); --j)
L.r[j+1]=L.r[j]; //记录后移
L.r[j+1]=L.r[0]; //插入到正确位置
}
} //InsertSort
4、特性
-
时间复杂度:
最好情况时间复杂度为O(n)
最坏情况时间复杂度为O(n2)
平均情况O(n2) -
空间复杂度: * O(1)*
-
算法稳定性: 稳定