插入排序算法原理及java代码实现

1、简介与原理

在大多数情况下,插入排序算法是这三种排序中最好的一种。虽然插入排序算法仍然需要 O(N^2N2)的时间,但是在一般情况下,它要比冒泡排序快一倍,比选择排序还要快一点。尽管它比冒泡排序算法和选择排序算法都更麻烦一些,但它也并不很复杂。它经常被用在较复杂的排序算法的最后阶段,例如快速排序。

插入排序原理即:局部有序,先把第一个数据看成一个有序数组,然后把第二个数据插入到这个“有序数组”中,形成具有两个数据的有序数组,依次类推,直至最后一个数据插入到具有 N-1 个数据的有序数组中,完成排序。插入过程:获取当前数据,并标记当前数据与下标,与之前有序数据的最后一个作比较,若小于最后一个数据则将最后一个数据进行后移操作,然后再与倒数第二个数据进行比较,重复刚才的操作,若不小于则终止操作。

2、代码实现

public class InsertSort {

 

public static void main(String[] args) {

// TODO 自动生成的方法存根

  int []a={5,1,45,8,6,18,4,89};

  InsertSort(a);

  for(int m:a){

System.out.println(m);

}

}

 

public static void InsertSort(int array[]){

 for(int i=1;i<array.length;i++){

    int temp=array[i];

     while(i>0&&temp<array[i-1]){

   array[i]=array[i-1];

    i--;

}

array[i]=temp;

}

}

}

3、效率

在第一趟排序中,它最多比较一次,第二趟最多比较两次,依此类推。最后一趟最多,比较 N-1 此。因此有

1+2+3+…+N-1=N*(N-1)/2

然而,因为在每一趟排序发现插入点之前,平均只有全体数据项的一半真的进行了比较,我们除以 2 得到 N*(N-1)/4

复制的次数大致等于比较的次数。然而,一次复制与一次交换的时间耗费不同,所以相对于随机数据,这个算法比冒泡排序快一倍,比选择排序略快。

对于随机顺序的数据进行插入排序也需要O(N^2N2)的时间级。

对于已经有序或者基本有序的数据来说,插入排序要好得多。当数据有序的时候,while 循环的条件总是假的,所以它变成了外层循环中的一个简单语句,执行 N-1 次。在这种情况下,算法运行只需要 O(N)的时间。如果数据基本有序,插入排序几乎只需要 O(N)的时间,这对把一个基本有序的文件进行排序是一个简单而有效的方法。

然而,对于逆序排列的数据,每次比较和移动都会执行,所以插入排序不比冒泡排序快。

4、冒泡、选择、插入三种排序之间的比较

除非手边没有算法可以参考,一般情况几乎不太使用冒泡排序算法。它过于简单了,以至于可以毫不费力地写出来。然而当数据量很小的时候它会有些应用的价值。

选择排序虽然把交换次数降到了最低,但比较的次数仍然很大。当数据量很小,并且交换数据相对于比较数据更加耗时的情况下,可以应用选择排序。

在大多情况下,假设当数据量比较小或者基本上有序时,插入排序算法是三种简单排序算法中最好的选择。对于更大数据量的排序来说,快速排序通常是最快的方法:之后会有介绍。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值