直接插入排序的基本思想

关于直接插入排序,在我看来它不过是对简单的选择排序进行了优化,相当于一个动态的选择排序,不过这里边的哨兵用处特别大。

void Insert_Sort(SqList* L) 
{
    int i, j;
    for (i = 2; i <= L->length; i++) 
    {
        if (L->Array[i] < L->Array[i - 1]) 
        {   //需将L->Array[i]插入有序子表
            L->Array[0] = L->Array[i]; 
            //设置哨兵Array[0],用来临时存储变量
            for (j = i - 1; L->Array[j] > L->Array[0]; j--) 
            	//与哨兵位置的值进行对比,比它的值大则向后移动
                L->Array[j + 1] = L->Array[j]; 
            L->Array[j + 1] = L->Array[0];  //插入到正确位置
        }
    }
}

我对于这种算法理解的数组中元素变化情况如下图:
在这里插入图片描述
是不是有人对第三步产生了疑问?别急接下来会解释到。
第一步:
我们先将 i 位置的元素值赋值给哨兵,然后利用哨兵与第 j 个位置的元素进行对比(也就是间接的将 i 位置元素与 j 位置元素进行对比)。
第二步:
j 大于哨兵元素值或i元素值,将j位置元素赋值给原来i存储位置的值(相当于 j + 1)。此时程序运行到了在这里插入图片描述
这个时候j的值是不是 i - 1(因为 i 从2开始,所以 j =1),当我们把 j 后移后 j - -,Array[j] = Array[0],不满足循环条件,此时退出该层循环。
第三步:
此时的 j - - 是不是就等于0了,也相当于哨兵位置的值,将他移动到将j原来的位置。依次遍历后边元素便能对数组进行排序了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值