-
利用
顺序查找
实现在有序序列区
中查找R[i](无序序列区第一个记录)
的插入位置。
如下图,
-
算法实现要点 / 步骤
1、从 R[i-1] 起向前进行顺序查找,监视哨设置在 R[0]。
R[0] = R[i]; //设置哨兵
for(j=i-1; R[0].key<R[j].key; --j ); //从后往前找
循环结束
表明 R[i] 的插入位置为 j+1。
2、在查找过程中找到关键字不小于 R[i].key 的记录
,并在查找的同时实现记录向后移动。
for(j=i-1; R[0].key<R[j].key; j-- ) { R[j+1] = R[j]; }
3、每一趟
插入一条记录
到有序序列区
,i = 2, 3, …, n。实现整个序列
的排序。
for(i=2; i<=n; i++)
{
if(R[i].key < R[i-1.key])
{
//此时需要将R[i]插入到R[1 .. i-1] 有序序列区中
R[0] = R[i];
for(j=i-1; R[0].key<R[j].key; j--)
{
//比有序区的key小,记录指针后移
R[j+1] = R[j];
}
// 放到正确的位置
R[j+1] = R[0];
}
}
直接插入排序的空间性能分析
- 只需要一个单位的
辅助空间
。
直接插入排序的时间性能分析
- (直接插入)排序的基本操作
1、比较序列中两个关键字的大小。
2、移动记录。 - 最好的情况(关键字在记录序列中顺序有序):
比较的次数:n-1
移动的次数:0 - 最坏的情况(关键字在记录序列中逆序有序):
比较的次数:2 + … + n = (n+2)(n-1) / 2
移动的次数:(2+1)+ … + (n+1) - 一般情况
取最好情况
和最坏情况
的平均值,时间复杂度为O(n2)