你应该知道的常用排序算法之插入排序

本文深入浅出地介绍了插入排序算法,通过对比扑克牌整理过程,解析其工作原理与步骤。文章详细阐述了插入排序的算法思想,包括构建有序序列、比较与插入的过程,以及其实现代码。同时,分析了插入排序的时间复杂度,指出其在小规模数据排序中的优势。

人生有涯,学海无涯

前面跟大家分享的排序算法之快速排序,今天跟大家分享另外一个排序算法——插入排序。插入排序可能大家在平时真正用到地方不多,但是也会用到,而且有一个场景我想大家一定经历过,那就打扑克牌。想想我们在抓牌的时候,是不是随着拿到一张张的扑克牌,然后按照顺序插入我们左手呢(或者右手上)?这其实就是插入排序,通过依次比较前一个数字的大小,将需要排序的数字插到最适合的位置,下面我们一起看下吧。

01、插入排序

我们先看看维基百科的解释:

插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用 in-place 排序(即只需用到 O(1) 的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

02、算法思想

插入排序的算法思想是通过构建有序序列,对未排序的数据从有序队列中依次进行比较,找到相应的位置进行插入。注意,如果当前位置不满足的情况下是需要将该位置的元素进行后移,以便腾出位置。

插入排序算法的实现大致分成三步

  1. 获取待插入的元素:

  2. 将待插入的元素与前一个元素进行比较;

  3. 如果当前元素与待插入元素大则将当前元素进行后移,再依次比较。

03、算法实现

/**
 * <br>
 * <b>Function:</b><br>
 * <b>Author:</b>@author 子悠<br>
 * <b>Date:</b>2019-09-25 00:24<br>
 * <b>Desc:</b>无<br>
 */
public class InsertSort {

    public static void main(String[] args) {
        int[] array = new int[]{2, 3, 1, 4, 7, 8, 3, 5, 2, 6, 8, 9, 1};
        insertSort(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }

    /**
     * 插入排序
     *
     * @param array 待排序数组
     */
    public static void insertSort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            //待插入的元素
            int needInsert = array[i];
            //开始比较的索引
            int index = i - 1;
            while (index >= 0 && array[index] > needInsert) {
                //将该位置的元素进行后移
                array[index + 1] = array[index];
                //再比较该位置前一个元素
                index--;
            }
            //当前位置满足条件
            array[index + 1] = needInsert;
        }
    }
}

运行结果:

1 1 2 2 3 3 4 5 6 7 8 8 9

从上面的代码我们可以看到,相对于快速排序,插入排序还是比较简单的,而且理解起来也相对容易,代码中已经增加了详细的注释,相信大家都能理解。注意的点就是每次在比较完之后,对于不满足的元素,我们需要进行一个后移,这个才能给待插入的元素在数组前面腾出空间。也就是代码的 array[index + 1] = array[index]; 这一行。

插入排序算法的最好时间复杂度,是序列本身就已经有序的情况下,是 O(n),最坏的时间复杂度是 O(n^2),平均时间复杂度也是 O(n^2)。由于没有申请额外的空间,所以空间复杂度为 O(1)。

插入排序算法在数据量不是很大的时候还是比较快速好用的,但是如果数据量很大就不建议采用插入排序了,可以采用变种的二分查找,有机会再给大家介绍,一般数据不超过千的时候都是可以使用的。

04、总结

这篇文章简单给大家介绍了一下插入排序的思想和实现,排序算法是大家日常工作和学习不可避免要学习的知识,我们《Java 极客技术》也会在后续的文章中慢慢的给大家分享很多优质的,算法和数据结构的文章,便于大家学习和成长。最后欢迎大家到我们《Java 极客技术》知识星球中一起学习和进步,扫描下放二维码还有优惠,我们在知识星球中等你。

640?wx_fmt=png

一、 内容概要 本资源提供了一个完整的“金属板材压弯成型”非线性仿真案例,基于ABAQUS/Explicit或Standard求解器完成。案例精确模拟了模具(凸模、凹模)与金属板材之间的接触、压合过程,直至板材发生塑性弯曲成型。 模型特点:包含完整的模具-工件装配体,定义了刚体约束、通用接触(或面面接触)及摩擦系数。 材料定义:金属板材采用弹塑性材料模型,定义了完整的屈服强度、塑性应变等真实应力-应变数据。 关键结果:提供了成型过程中的板材应力(Mises应力)、塑性应变(PE)、厚度变化​ 云图,以及模具受力(接触力)曲线,完整再现了压弯工艺的力学状态。 二、 适用人群 CAE工程师/工艺工程师:从事钣金冲压、模具设计、金属成型工艺分析与优化的专业人员。 高校师生:学习ABAQUS非线性分析、金属塑性成形理论,或从事相关课题研究的硕士/博士生。 结构设计工程师:需要评估钣金件可制造性(DFM)或预测成型回弹的设计人员。 三、 使用场景及目标 学习目标: 掌握在ABAQUS中设置金属塑性成形仿真的全流程,包括材料定义、复杂接触设置、边界条件与载荷步。 学习如何调试和分析大变形、非线性接触问题的收敛性技巧。 理解如何通过仿真预测成型缺陷(如减薄、破裂、回弹),并与理论或实验进行对比验证。 应用价值:本案例的建模方法与分析思路可直接应用于汽车覆盖件、电器外壳、结构件等钣金产品的冲压工艺开发与模具设计优化,减少试模成本。 四、 其他说明 资源包内包含参数化的INP文件、CAE模型文件、材料数据参考及一份简要的操作要点说明文档。INP文件便于用户直接修改关键参数(如压边力、摩擦系数、行程)进行自主研究。 建议使用ABAQUS 2022或更高版本打开。显式动力学分析(如用Explicit)对计算资源有一定要求。 本案例为教学与工程参考目的提供,用户可基于此框架进行拓展,应用于V型弯曲
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值