直接插入排序

直接插入排序是一种最简单的排序方法,它的基本思想是依次将每个记录插入到一个有序中去。就是说,第i(i>=1)遍整理时,A1,A2,...,Ai-1已经是排好序的子序列;取出第i个元素Ai,在已排好序的子序列为Ai找到一个合适的位置,并将它插到该位置上。易知上述排序当i=1时实际上为空操作,故可直接从i=2开始。
为了便于控制循环结束,引入元素A[0],行时可以节省时间,
直接插入排序的算法如下:

void strainsert(r,n)
int n,r; 结构类型
{
     int i,j;
    //外层循环标识并决定待比较的数值。

     for(i=2;i<n;i++)    //这里的i=2表示的是第2个元素
       {
            r[0]=r[i];    //待比较元素
            j=i-1;        //比较元素的前一项
    //内层循环为待比较数值确定其最终位置
            while( r[0].key < r[j].key )   //比较相邻的前项,如果满足条件,同时在和前项比较
            {
                 r[j+1]=r[j];  //把前面大的项往前移一位
                 j=j-1;        
            } 
           r[j+1]=r[0];
       }


初始序列:
i=1 [46] 58 15 45 90 18 10 62
        ↓
i=2 [46 58] 15 45 90 18 10 62
         ┌——┘
         ↓
i=3 [15 46 58] 45 90 18 10 62
             ┌——┘
             ↓
i=4 [15 45 46 58] 90 18 10 62
                            ↓
i=5 [15 45 46 58 90] 18 10 62
             ┌—————┘
             ↓
i=6 [15 18 45 46 58 90] 10 62
        ┌————————┘  
        ↓
i=7 [10 15 18 45 46 58 90] 62
                                      ┌—┘
                                      ↓
i=8 [10 15 18 45 46 58 62 90]

算法中引进附加记录A[0]有两个作用:其一是进入查找循环之前,它保存了A[ i ]的值,使得不致于因记录的后移而丢失A[ i ]中的内容;其二是在While循环"监视"下变量j是否越界,一旦越界(即j&lt;1),A[0]自动控制While循环的结束,从而避免了在While循环中每一次都要检测j是否越界(即省略了循环条件"j&gt;=1")。因此我们把称为"监视哨",这种技巧,使得测试循环条件的时间大约减少一半,对于记录数较大的文件,节约的时间相当可观。希望读者能掌握这种技巧。
由此可见,直接插入排序算法简洁,易理解,容易实现。当序列中的记录“基本有序”或n值较小时,它是最佳的排序方法。但是,通常待排记录的数量n很大,此时直接插入排序就不适用了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值