博客
关于我
Java常见排序算法之插入排序
阅读量:762 次
发布时间:2019-03-23

本文共 1553 字,大约阅读时间需要 5 分钟。

插入排序是一种经典的简单排序算法,它的工作原理与日常生活中的整理行为有着相似的逻辑。通过对待排序数组的逐步调整,插入排序能够有效地将数组按顺序排列。以下将详细介绍插入排序的原理、与选择排序的区别、Java代码实现以及适用场景。

插入排序的原理

插入排序的基本思想是从数组中逐个取出一个元素,并将其插入到已排序的前一部分中,直到整个数组被排序。具体步骤如下:

  • 初始化一个空数组或向真空中逐一将元素插入。
  • 每次从原数组中取出一个元素,将其插入到目标数组的适当位置(即插入位置)。
  • 重复上述过程直到原数组中的元素全部插入到目标数组中。
  • 以数组 [1, 3, 2, 4, 6] 为例:

    • 第一次取出 1,插入目标数组,目标数组为 [1]
    • 第二次取出 3,插入目标数组,目标数组为 [1, 3]
    • 第三次取出 2,插入目标数组:2 小于 3,插入位置变为 [1, 2, 3]
    • 第四次取出 4,插入目标数组:4 大于 3,插入位置变为 [1, 2, 3, 4]
    • 第五次取出 6,插入目标数组:6 大于 4,插入位置变为 [1, 2, 3, 4, 6]

    通过上述步骤,我们完成了对原始数组的插入排序。

    插入排序与选择排序的区别

    与选择排序相比,插入排序在处理已经部分排序的数组时效率更高。选择排序需要对整个数组中的元素进行多次比较,与当前位置的元素交换位置。而插入排序则是将元素逐一插入到已经排序好的数组中,时间复杂度因此也会相应降低。

    插入排序的Java代码实现

    以下是插入排序的Java代码示例:

    public class InsertSort {    public static void sort(int[] array) {        int length = array.length;        for (int i = 0; i < length; i++) {            int current = array[i];            int j = i - 1;            while (j >= 0 && current <= array[j]) {                array[j] = current;                current = array[j - 1];                j--;            }            array[j + 1] = current;        }    }    public static void main(String[] args) {        int[] array = {1, 3, 2, 4, 6};        sort(array);        for (int num : array) {            System.out.print(num + " ");        }        // 输出:1 2 3 4 6    }}

    插入排序的时间复杂度

    插入排序的时间复杂度取决于数组的初始状态:

  • 有序数组:时间复杂度为 O(n),因为每个元素仅需一次移位操作。
  • 无序数组:在最坏情况下,时间复杂度为 O(n^2),因为元素可能需要多次移动到其正确位置。
  • 这种复杂度特性使得插入排序在以下场景下表现优越:

  • 数组中元素的位置变化较小,例如数组 [2, 1, 3] 只需对 2 进行调整。
  • 数组已有部分排序,比如 [4, 5, 6, 1, 2, 3],其中 4、5、6 已经处于正确位置。
  • 数组中元素几乎处于正确位置,除了少数局部需要调整。
  • 通过以上分析,可以清晰地看到插入排序在具体应用场景中的优势。

    转载地址:http://tmxzk.baihongyu.com/

    你可能感兴趣的文章
    Panalog 日志审计系统 sprog_deletevent.php SQL 注入漏洞复现
    查看>>
    Panalog 日志审计系统 sprog_upstatus.php SQL 注入漏洞复现(XVE-2024-5232)
    查看>>
    Panalog 日志审计系统 前台RCE漏洞复现
    查看>>
    PANDA VALUE_COUNTS包含GROUP BY之前的所有值
    查看>>
    pandas - 如何将所有列从对象转换为浮点类型
    查看>>
    Pandas - 按列分组并将数据转换为 numpy 数组
    查看>>
    Pandas - 按日期对日内时间序列进行分组
    查看>>
    Pandas - 有条件的删除重复项
    查看>>
    pandas -按连续日期时间段分组
    查看>>
    pandas -更改重新采样的时间序列的开始和结束日期
    查看>>
    SpringBoot+Vue+Redis前后端分离家具商城平台系统(源码+论文初稿直接运行《精品毕设》)15主要设计:用户登录、注册、商城分类、商品浏览、查看、购物车、订单、支付、以及后台的管理
    查看>>
    pandas :to_excel() float_format
    查看>>
    pandas :从数据透视表中的另一列中减去一列
    查看>>
    pandas :加入有条件的数据框
    查看>>
    pandas :将多列汇总为一列,没有最后一列
    查看>>
    pandas :将时间戳转换为 datetime.date
    查看>>
    pandas :将行取消堆叠到新列中
    查看>>
    pandas :设置编号.最大行数
    查看>>
    pandas DataFrame 中的自定义浮点格式
    查看>>
    Pandas DataFrame 的 describe()方法详解-ChatGPT4o作答
    查看>>