1. 问题描述
2. 算法思想
将待排序数据分成已排序部分sorted和未排序部分unsorted。插入表示的是将未排序部分unsorted中一个数据key插入到已排序的数据sorted当中。假设数据的个数为 N,初始时将第一个数据作为已排序部分,剩下的 N-1 个数据作为未排序部分。如此,总共执行 N-1 次插入,便可完成对输入数据的排序。
此思想类似打扑克牌时摸牌阶段。
3. 伪代码实现
4. C++实现
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
const int MAXSIZE = 20;
typedef struct RecordType{
KeyType key;
InfoType otherinfo;
}RecordType;
typedef struct SqList{
RecordType r[MAXSIZE];
int length;
}SqList;
// 直接插入排序
void insertion_sort(SqList &L)
{
for (int i=1; i<L.length; ++i)
{
// 需要用record将L.r[i]中的数据保存起来
// 因为L.r[i]可能被L.r[j+1]=L.r[j]覆盖
RecordType record = L.r[i];
int j = i - 1;
while ( j>=0 && LT(record.key, L.r[j].key) )
{
L.r[j+1] = L.r[j];
--j;
}
L.r[j+1] = record;
}
}
5. 算法复杂度分析
时间复杂度:
空间复杂度为 ,此算法是原地排序的。
稳定排序算法。