插入排序算法

16 篇文章 3 订阅
4 篇文章 1 订阅

插入排序算法通过比较和插入来实现排序,具体如下:

1)假设第0个元素是排序好的,第1个元素与之经较,如果小于第0个,最把第0个元素后移一个,把第1个元素插入到第0个位置

2)接着,第2个元素,与前两个元素比较,把第3个插入到合适的位置

3)重复上述过程,直接最后一个元素插入到合适的位置,结束!

为了更好的理解下面通过一个实际例子来一步步的执行排序算法

举例说明:要排序数组:int[] a={101,99,118,112,85};   

第一轮排序:

    第一次排序:第1个元素和第0个元素比较,99小于101,把101后移一个位置,把99插入到第0个位置,完成后:99,101,118,112,85

    第二次排序:第2个元素和第1、0个元素比较,118大于第1个元素结束,完成后:99,101,118,112,85

    第三次排序:第3个元素和第2、1、0个元素比较,112小118,把118后移一个位置,接着再与101比较,112大于101结束,完成后:99,101,112,118,85

    第四次排序:第4个元素和第3、2、1、0个元素比较,85小于118,118后移,再与112比较,112后移...,完成后:85,99,101,118,112

    第一轮总共进行了4次比较, 排序结果:      85,99,101,112,118


下面看实现代码

public class InsertSort {
public static void main(String[] args) {
int arr[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};  
    int target;
    int j;
    //假定第一个元素被放到了正确的位置上
    //这样,仅需遍历1 - n-1
    for (int i = 1; i < arr.length; i++)
    {
     target = arr[i];
     for(j=i;j>0;j--){
     if(target<arr[j-1]){
     arr[j] = arr[j-1];
     }else{
     break;//位置找到,j就是正确的位置,a[j]=target即可
     }
    
     }
     arr[j]=target;
 System.out.println();
 for(int item:arr){//每一轮结束后最大的沉底
 System.out.print(" "+item);
 }
    }
}
}

代码最难理解的地方是内层循环的结束条件,其实结合上述具体实例也是不难懂的,首先把第i个元素保存起来到target,然后再与i-1到0个元素依次比较,如果第target元素小,就是第i-1个元素后移到第i个位置,然后target再与第i-2个元素比较,直接target大于等于当前元素,结束!内存循环就是为了找到合适的位置!

时间复杂度分析:

最好的情况是,数据本来就有序,内层循环一进入就直接break,此时时间复杂度是O(n)

最坏的情况是,target比前面的元素都小,这时前面i-1个元素都要后移,时间复杂度是O(n^2)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿童木-atom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值