直接插入排序

基本思想

在插入第 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]有两个作用:

  1. 进入循环之前暂存了r[i]的值,使得不致于因记录的后移而丢失r[i]的内容;
  2. 在查找插入位置的循环中充当哨兵。
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];	
    }
}

优缺点

直接插入排序算法简单、容易实现,适用于待排序记录基本有序或待排序记录个数较小的情况。
当待排序的记录个数较多时,大量的比较和移动操作使直接插入排序算法的效率降低。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值