算法之插入排序

    学过数据结构的我们,对于算法肯定都不陌生。算法在IT界有着不可或缺的作用。下面我们就挨个来说一下算法家族的亲们!

   今天就先说插入排序吧。

   常见的插入排序有:直接插入排序,希尔排序,折半插入排序,表插入排序。对于前两种我们多多少少接触过。

(一)直接插入排序

    直接插入排序算是一种最简单的插入排序了。它的基本思想是一次将每个记录插入到一个已排好序的有序表中去,得到一个新的有序表。光说概念可能就抽象,我们来看一个直接插入排序的例子:


明白了基本排序原理,我们再来看一下它的算法:

void InsertSort(SqList &L){
//对顺序表L进行直接插入排序
for (i=2;i<=L.length;i++){  //从第2个元素起进行插入
    L[0]=L[i]; //第i个元素复制为岗哨
    j=i-1; //j为岗哨前元素个数,即岗哨与之比较的个数
    while (L[0].key<L[j].key) //第j个元素与岗哨进行比较,至值不大于岗哨时
      {  //前i-1个数都是从小到大的有序序列,所以只要当前比较的数比岗哨大,就把这个数后移一位
         L[j+1]=L[j];
         j--;
       }
    L[j+1]=L[0]; //将第i个记录插入到序列中
  }
   if()
}
算法分析:

(1)时间复杂度:
   当数据正序时,执行效率最好,每次插入都不用移动前面的元素,时间复杂度为O(N)。 
   当数据反序时,执行效率最差,每次插入都要前面的元素后移,时间复杂度为O(N2)。
   所以,数据越接近正序,直接插入排序的算法性能越好。

(2)空间复杂度:

   由于排序过程中,我们只需要一个临时变量存储要插入的值,所以空间复杂度为1.

(3)稳定性:

   在排序过程中,不改变相等数值元素的位置,所以直接插入排序是稳定的算法。

综上:


(二)希尔排序

   相对于直接插入排序来说,希尔排序就有些复杂了。它是直接插入排序的改进,又称缩小增量排序。我们先来看一下希尔排序的排序过程:

如下图,

1.首先将序列分为5个子序列,(R1R6,R2R7,R3R8,R4R9,R5R10),对这5个子序列分布进行直接插入排序,得到第一趟。

2.然后对3个子序列(R1R4R7R10,R2R5R8,R3R6R9)进行直接插入排序,得到第二趟。

……


算法分析:



评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值