直接插入算法
直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。
假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。
例如:
假设待排序元素为49,38,65,97,76,13,27,49
那么第一趟排序将49作为已经排好序的顺序表,将后边的38与之比较,可知38<49,所以38进入到临时存储位置,而前边的有序表后移,也就是将49后移,同时,将38从临时存储位置调到49前面的位置。
38 49 65,97,76,13,27,49 //假设49是排好序的表,将38移到临时存储位置
38 49,65,97,76,13,27,49//将有序表后移,也就是49后移
38,49,65,97,76,13,27,49//将38从临时存储位置调到49前面的位置
第二趟排序:
38,49,65,97,76,13,27,49 //38,49是排好序的表,将65与49比较大于49不移动
38,49,65,97,76,13,27,49
第三趟排序:
38,49,65,97,76,13,27,49 //38,49,65是排好序的表,将97与65比较大于65不移动
第四趟排序
38,49,65,97,76,13,27,49
第五趟排序
38,49,65,76,97,13,27,49
……
最后结果:
13,27,38,49,49,65,76,97
直接插入排序稳定,空间复杂度为O(1),平均时间复杂度为O(n^2)
代码:
/*直接插入排序,假设L为顺序表结构,其中数组r存储数据,length为数组的长度*/
void Insertsort(Sqlist *L)
{
int i,j;
for (i=2;i<=L->length;i++)//假设第一个是已经排好序
{
if(L->r[i]<L->r[i-1]))
L->r[0]=L-r[i];
for(j=i-1;L->r[j]>L->r[0];j--)//元素后移
{
L->r[j+1]=L->r[j]
}
L->r[j+1]=L->r[0];
}
}