一篇看懂插入排序InsertSort算法与代码

本文详细介绍了插入排序的工作原理,代码实现以及性能分析。插入排序是简单的排序算法,通过构建有序序列,将未排序元素逐步插入。其时间复杂度在最好情况为O(n),最坏情况为O(n^2),平均为O(n^2)。该算法在小规模数据或接近有序的数据上表现较好,且空间复杂度为O(1),是稳定的排序算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理

插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。插入排序是稳定的排序算法。
能用冒泡排序算法的必然能用插入排序。
在这里插入图片描述
插入排序时将整个区间被分为有序区间,和无序区间。每次选择无序区间的第一个元素,在有序区间选择合适的位置插入。通常,我们将数组中的第一个元素预设为有序区间。
在这里插入图片描述

代码实现

    public static void insertSort(int[] array) {
        for (int i = 1; i < array.length; i++) {
            int num = array[i];
            int j;
            for (j = i - 1; j >= 0 && array[j] > num; j--) {
                array[j + 1] = array[j];
            }
            array[j + 1] = num;
        }
    }

代码分析

在这里插入图片描述
例如,我们以i为1举例:
1,我们刚开始时array[0,1)为有序区间,则要对array[1,array.length)中的第一个位置的元素array[1]进行排序。暂时j为有序区间的最后一个下标处,,每次内循环一次,j往前(j-1处)走一步。
2.1,如果array[1]>=array[0],那么,j就为array[0]的下标,j+1处就是array[1]的原位置,并且,让有序区间[0,i)向后走一步,成为[0,2)。有序区间长度+1。
2.2,如果array[1]<array[0],那么,j就一直往前走直到就j==0无序区间走完了,说明array[1]为此时无序区间的最小的数,需要放在无序区间的最前面;或者j走的过程中遇到array[j]<array[0]时,说明j前面的数都是小于array[0]的,j后面的数都是大于array[0],则此时需要将j后面的数都往后挪一个位置,腾出j+1处的位置,将array[0]放在j+1处。
3,一直这样循环下去,直到将无序区间[i,array.length)中所有元素都在有序区间[0,i)处插入到正确的位置。
4,循环完成后[0,array.length)都成为有序区间。

性能分析

在这里插入图片描述
时间复杂度:
当数组有序时,时间复杂度最低为O(n),数组逆序时,时间复杂度最坏为O(n2);平均复杂度为:O(n2)。
插入排序,小规模数据,或初始数据越接近有序,时间效率越高。
空间复杂度:
空间复杂度为O(1),是因为冒泡排序花费了常数个额外空间。

稳定性

插入排序是稳定的排序算法。因为第一个插入的是无序区间第一个遍历的数,无序区间排列的先后顺序决定了代码的遍历顺序,进而决定了循环的插入顺序。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值