【排序算法】插入排序

1.基本介绍

插入排序(Insertion Sort)是一种简单直观的排序算法。
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,从而使得整个序列逐步有序。

2.数据演示

第0次排序为(2  5  1  7  3)

第1次排序为2  6  (5  1  7  3)
第2次排序为2  5  6  (1  7  3)
第3次排序为1  2  5  6  (7  3)
第4次排序为1  2  5  6  7  (3)
第5次排序为1  2  3  5  6  7

如图所示,将红色数组排成有序数组,那么 在后面无序数组第一个元素插入到有序数组的对应位置。反复n-1次即可完成。

3.具体步骤

1. 从第一个元素开始,该元素可以认为已经被排序。
2. 取出下一个元素,在已经排序的元素序列中从后向前扫描。
3. 如果已排序的元素大于新元素,将已排序的元素向后移一位。
4. 重复步骤 3,直到找到已排序元素小于或者等于新元素的位置。
5. 将新元素插入到该位置。
6. 重复步骤 2 - 5,直到所有元素都被排序。

思路:小编认为在外循环中确定执行的次数,以及确定无序数组第一个元素的下标,因为每次有序数组排序后,无序数组中取值要跟着变化;内部循环,要进行排序,以及插操作。

4.代码如下

public class insert {
    public static void main(String[] args) {
        int arr[]={6,2,5,1,7,3};

        for(int i=1;i< arr.length;i++){
            int insert=arr[i];

            //无序数组的第一个对比的数
            int insertIndex=i-1;
            //对比数前一个数的索引
            while (insertIndex>=0 && insert<arr[insertIndex]){
                arr[insertIndex+1]=arr[insertIndex];
                insertIndex=insertIndex-1;
            }
            arr[insertIndex+1]=insert;
            System.out.println("第"+i+"次排序为"+Arrays.toString(arr));
        }
        System.out.println("最终排序为"+Arrays.toString(arr));


    }
}

小编这里,将无序数组的值保存在一个变量里面,当执行满足小于前一个数时,将有序数组的值前移,最后不满足条件后,将变量的值插入到指定位置。

例如

2  6  5  1  7  3

先将5先前比较,发现 6 > 5,所以现将5存在变量里,6的值向前移变成

2  6  6  1  7  3

然后继续比较5>2,那么跳出循环,将5的值插入得到

2  5  6  1  7  3

 演示结果

第1次排序为[2, 6, 5, 1, 7, 3]
第2次排序为[2, 5, 6, 1, 7, 3]
第3次排序为[1, 2, 5, 6, 7, 3]
第4次排序为[1, 2, 5, 6, 7, 3]
第5次排序为[1, 2, 3, 5, 6, 7]
最终排序为[1, 2, 3, 5, 6, 7]

5.时间演示

时间在循环执行前后分别进行打印,在100000个数据中排序只要2秒。

6.总结 

插入排序的平均时间复杂度为 O(n^2) ,空间复杂度为O(1)  。它在对小规模数据进行排序时表现较好,并且代码实现相对简单。

但是缺点是

1. 时间复杂度较高:在最坏情况下,即数组完全逆序时,时间复杂度为  ,对于大规模数据的排序效率较低。

例如:2 3 4 5 1

第一次:2 3 4 5 1

第二次:2 3 4 5 1

第三次:2 3 4 5 1

第四次:1 2 3 4 5


2. 不适合大规模数据
3. 稳定性有限

最后限于小编能力有限,欢迎各位uu提出宝贵意见。

要是觉得小编的作品对你来说有帮助的话就点个小小的赞吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值