当前位置: 首页 > article >正文

【算法-插入排序】基础知识,代码示例和应用场景

插入排序是一种相对简单、直观的排序算法,有点类似打扑克牌时将一张张牌“插入”到合适位置的过程。虽然插入排序的效率不如高级排序算法,但它有自己独特的优点,尤其在小数据集或已部分有序的数据中表现出色。


什么是插入排序

插入排序是一种逐步构建有序列表的算法。它将数组分成“已排序部分”和“未排序部分”,然后从未排序部分中挑选元素插入到已排序部分的合适位置。想象打扑克牌时,一张张将牌放在手中按照大小排好,就是插入排序的过程。

插入排序的操作过程

插入排序

假设有一个无序的数组 [8, 4, 3, 7, 6],我们用插入排序把它从小到大排序。

  1. 第一步

    • 假设第一个元素 [8] 已经有序。
    • 从第二个元素开始 [4],插入到 [8] 之前。
    • 结果为 [4, 8, 3, 7, 6]
  2. 第二步

    • 将第三个元素 [3] 插入到 [4, 8] 中。
    • [3][4] 小,放到最前面。
    • 结果为 [3, 4, 8, 7, 6]
  3. 第三步

    • 将第四个元素 [7] 插入到 [3, 4, 8] 中。
    • [7][4] 大,但比 [8] 小,因此插入到 [8] 之前。
    • 结果为 [3, 4, 7, 8, 6]
  4. 第四步

    • 将第五个元素 [6] 插入到 [3, 4, 7, 8] 中。
    • [6][7] 小,所以插入到 [7] 之前。
    • 最终结果为 [3, 4, 6, 7, 8]

通过这样一轮轮的插入,数组逐渐变得有序。


插入排序的代码实现

下面是插入排序的 Java 代码实现,每一步都附带注释,方便理解。

public class InsertionSort {
    public static void insertionSort(int[] arr) {
        // 从第二个元素开始逐个插入
        for (int i = 1; i < arr.length; i++) {
            int current = arr[i];
            int j = i - 1;
            
            // 向左扫描已排序部分,找到插入位置
            while (j >= 0 && arr[j] > current) {
                arr[j + 1] = arr[j]; // 向右移动元素
                j--;
            }
            
            // 把当前元素插入到合适位置
            arr[j + 1] = current;
        }
    }

    public static void main(String[] args) {
        int[] arr = {8, 4, 3, 7, 6};
        insertionSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

代码运行过程

对于数组 [8, 4, 3, 7, 6],代码运行时会执行以下操作:

  • 第一次循环,i = 1,将 4 插入到 8 前面。
  • 第二次循环,i = 2,将 3 插入到 4 前面。
  • 第三次循环,i = 3,将 7 插入到 8 前面。
  • 第四次循环,i = 4,将 6 插入到 8 前面。

这样一轮轮下来,最终输出的是 [3, 4, 6, 7, 8]


插入排序的时间复杂度

插入排序的时间复杂度取决于数据的有序程度:

  • 最佳情况:当数组已经有序时,插入排序只需逐一比较,无需移动元素,时间复杂度为 (O(n))。
  • 最差情况:当数组完全逆序时,每个元素都需要比较和移动,时间复杂度为 (O(n^2))。
  • 平均情况:在一般随机数据下,插入排序的时间复杂度为 (O(n^2))。

由于其时间复杂度,插入排序并不适合处理大规模数据,但在小数据集或近似有序的场景下表现不错。


插入排序的适用场景

  1. 小型数据集:对于数量较少的数据(如几十个元素),插入排序的性能较好,足以胜任排序任务。
  2. 部分有序的数组:如果数组大部分是有序的,插入排序会比其他复杂排序算法更有效率,因为它不需要做太多的移动。
  3. 实时数据插入:在不断插入数据并保持有序的场景下,插入排序的特性十分适合,比如插入排序在链表的排序上应用较多。

插入排序的优缺点

优点
  1. 简单易懂:算法逻辑清晰、容易实现,适合初学者掌握。
  2. 稳定性:插入排序是稳定的排序算法,相等的元素不会交换位置。
  3. 在线排序:能够实现实时插入,即在排序过程中可以逐步添加新元素,并将其插入到合适的位置。
缺点
  1. 效率较低:当数据规模增大时,插入排序的时间复杂度为 (O(n^2)),处理大数据时性能较差。
  2. 不适合逆序排序:当数据逆序或接近逆序时,插入排序需要更多的移动操作,因此效率不佳。

插入排序的实际应用

插入排序在很多实际情况下有用,比如:

  1. 少量数据排序:对于小数据量的情况(例如少于 100 个元素),插入排序的效率可以和高级排序算法媲美。
  2. 排序链表:插入排序在链表中应用广泛,因为在链表中插入元素时效率较高。
  3. 基本有序的数据:当数据大致有序,或者需要不断插入新数据并保持有序时,插入排序的性能表现良好。

插入排序的总结

插入排序是一种操作简单、适合初学者学习的排序算法。它的特点是在小规模数据或基本有序的情况下性能较好,且插入时不需要额外空间。虽然插入排序的效率不如高级排序算法,但在某些应用场景中仍然具有实际价值。

希望通过本章的学习,能够帮助大家更好地理解插入排序的基本原理、适用场景和代码实现。在掌握插入排序后,可以继续学习其他更复杂的排序算法,提升数据处理效率。


http://www.kler.cn/a/390438.html

相关文章:

  • 【MySQL】数据库表连接简明解释
  • springboot项目中,使用ProGuard 对代码进行混淆
  • jwt用户登录,网关给微服务传递用户信息,以及微服务间feign调用传递用户信息
  • GitLab 如何跨版本升级?
  • Android 下内联汇编,Android Studio 汇编开发
  • 从0开始学PHP面向对象内容之(常用魔术方法续一)
  • IDEA 如何手动创建spring boot工程
  • Day107:代码审计-PHP模型开发篇MVC层RCE执行文件对比法1day分析0day验证
  • .NET Core 应用程序如何在 Linux 中创建 Systemd 服务 ?
  • Vue3 - 小兔仙 - day2
  • 面试经典 150 题:121,125
  • 批量混剪矩阵发布助力短视频营销快速获客
  • 深度学习服务器租赁AutoDL
  • 使用git进行多人协作开发项目流程
  • Android WebSocket ping pong机制
  • MySQL如何利用索引优化ORDER BY排序语句
  • 【博主推荐】VUE开发常用技术点收集
  • QT中使用图表之QChart绘制动态折线图
  • Sam Altman:年底将有重磅更新,但不是GPT-5!
  • C# 有趣的小程序—桌面精灵详细讲解
  • docker save 和 docker load介绍
  • CTF记录
  • Chromium 中chrome.tabs扩展接口定义c++
  • C语言之简单的获取命令行参数和环境变量
  • 进程 线程 和go协程的区别
  • C++ 内联函数 详解分析 (含代码分析)