插入排序的执行流程

插入排序,从该算法的名字中也可以看出,这种算法会有插入操作,如果我们用数组作为底层的数据结构实现该算法的话,进行插入操作,需要移动现有元素,空出位置后,才能进行插入操作。插入排序的排序思路,主要就是将未排序的数据和已排序的数据进行比较,找到较小的元素后,移动到已排序区间中。插入排序是原地排序算法,也可以是一种稳定排序算法(如果元素相等,我们将后来的相等元素添加到已排序区间的末尾即可)。插入排序在实战中用的很少,主要原因是这种算法可能会演变成O(n²)。
我在网上找了一个动图,很直观,大家可以看一下,来源:https://www.cnblogs.com/fivestudy/p/10064969.html
在这里插入图片描述

下面,我们看一下java的实现

public static void main(String[] args) {
        int[] array = new int[]{1, 8, 5, 6, 7, 3, 2};
        insertionSort(array, array.length);
    }

    public static void insertionSort(int[] a, int n) {
        if (n <= 1) {
            return;
        }
        for (int i = 1; i < n; ++i) {
            int value = a[i];
            int j = i - 1;
            // 查找插入的位置
            for (; j >= 0; --j) {
                //判断是否需要移动元素
                if (a[j] > value) {
                    // 数据移动
                    a[j + 1] = a[j];
                } else {
                    break;
                }
            }
            // 插入数据
            a[j + 1] = value;
        }
    }

时间复杂度分析
最好情况下,数组是有序的,我们只需要一次比较操作就可以确定插入位置,所以最好情况时间复杂度是O(n)。
最坏情况下,数组是逆序的,我们每一轮比较操作,都需要移动n个数据,所以最坏情况时间复杂度是O(n²)。
平均情况下,数组一半逆序,一半有序。我们在一个数组中插入一个元素的时间复杂度是O(n),所以平均时间复杂度就是O(n²)。
空间复杂度分析
未借助临时空间,空间复杂度是O(1)。
原地排序算法分析
是原地排序算法
稳定排序算法分析
先说答案,是稳定排序。插入排序可以是一种稳定排序算法,当两个元素相同时,将相同元素添加到已排序区间的末尾即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值