1.直接插入排序
1) 定义
直接插入排序( straight insertion sort )是一种最简单的排序方法。它的基本操作是将一个记录插入到一个长度为 m (假设)的有序表中,使之仍保持有序,从而得到一个新的长度为 m + 1 的有序表。
2) 算法思路
设有一组关键字{ K 1 , K 2 ,…, K n };排序开始就认为 K 1 是一个有序序列;让 K 2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列;然后让 K 3 插入上述表长为 2 的有序序列,使之成为一个表长为 3 的有序序列;依次类推,最后让 K n 插入上述表长为 n-1 的有序序列,得一个表长为 n 的有序序列。
【例】设有一组关键字序列{ 55 , 22 , 44 , 11 , 33 },这里 n=5 ,即有 5 个记录。请将其按由小到大的顺序排序。排序过程如图9.1所示。
第一趟: [55] 22 44 11 33
第二趟: [22 55] 44 11 33
第三趟: [22 44 55] 11 33
第四趟: [11 22 44 55] 33
结果: [11 22 33 44 55
3)具体算法
template
void stinsort (T r[],int n)
{ int i,j;
for (i=2;i<=n;i++) //共进行n-1趟插入
{ r[0]=r[i]; //r[0]为监视哨,也可作下边循环结束标志
j=i-1;
while (r[j].key>r[0].key) { r[j+1]=r[j]; j--;}
r[j+1]=r[0]; //将r[0]即原r[i]记录内容,插到r[j]后一位置
}
} //sinsort
4) 算法时间复杂度
此算法外循环 n-1 次,在一般情况下内循环平均比较次数的数量级为O(n) ,所以算法总时间复杂度为O(n2) 。
5)直接插入排序的稳定性
直接插入排序是稳定的排序方法