基本思想
在插入第 i(i>1)个记录时,前面的 i-1个记录已经排好序。
直接插入排序算法是一种稳定的排序算法。
需要解决的问题?
(1)如何构造初始的有序序列?
(2)如何查找待插入记录的插入位置?
(1)如何构造初始的有序序列?
解决方法:
将第1个记录看成是初始有序表,然后从第2个记录起依次插入到这个有序表中,直到将第n个记录插入。
算法描述:
for (i=2; i<=n; i++) //i=1的数据为第一个记录,从它后面开始插入,直到n
{
插入第i个记录,即第i趟直接插入排序;
}
(2)如何查找待插入记录的插入位置?
解决方法:
在i-1个记录的有序区r[1] ~ r[i-1]中插入记录r[i],首先顺序查找r[i]的正确插入位置,然后将r[i]插入到相应位置。
算法描述:
r[0]=r[i]; j=i-1; //r[0]是空的,暂存待插入的记录r[i],j=i-1 待插之前的一个记录,
while (r[0]<r[j]) //循环,待插记录与前面的记录相比较,如果小于之前的记录,循环继续
{
r[j+1]=r[j]; //数据后移,r[i]的位置被i-1替换
j--; //j-1,最后一个数据比较完成,前面的继续比较,直到最后的j+1就是要插入的位置
}
注意:r[0]有两个作用:
- 进入循环之前暂存了r[i]的值,使得不致于因记录的后移而丢失r[i]的内容;
- 在查找插入位置的循环中充当哨兵。
void insertSort (int r[ ], int n){
for (i=2; i<=n; i++) {
r[0]=r[i]; j=i-1;
while (r[0]<r[j]) {
r[j+1]=r[j]; //若退出循环,表示找到插入位置,因为比较后都会有j--,最后的j+1是插入位置
j=j-1;
}
r[j+1]=r[0];
}
}
优缺点
直接插入排序算法简单、容易实现,适用于待排序记录基本有序或待排序记录个数较小的情况。
当待排序的记录个数较多时,大量的比较和移动操作使直接插入排序算法的效率降低。