排序算法:详解插入排序

快速排序介绍

插入排序是一种简单直观的排序算法,它的工作原理类似于我们整理扑克牌,将每个新元素插入到已排序部分的正确位置。

快速排序原理

一、核心思想

1. 将数组分为两部分

  • 已排序部分(初始时只有第一个元素)
  • 未排序部分(剩余的所有元素)

2. 逐个处理未排序元素

  • 从未排序部分取出一个元素
  • 在已排序部分中找到合适的位置插入
  • 重复直到所有元素都排序完成

二、工作原理图

让我们用数组

5, 2, 4, 6, 1, 3

来演示插入排序的过程:

复制代码
初始: [5, 2, 4, 6, 1, 3]
      ↑ (已排序部分只有5)

第1轮: 取出2,与5比较 → 2 < 5,5后移,2插入 → [2, 5, 4, 6, 1, 3]
第2轮: 取出4,与5比较 → 4 < 5,5后移;与2比较 → 4 > 2,插入 → [2, 4, 5, 6, 1, 3]
第3轮: 取出6,与5比较 → 6 > 5,直接插入 → [2, 4, 5, 6, 1, 3]
第4轮: 取出1,依次比较并移动6,5,4,2,1插入开头 → [1, 2, 4, 5, 6, 3]
第5轮: 取出3,依次比较并移动6,5,4,3插入 → [1, 2, 3, 4, 5, 6]

算法特点

特点 说明
稳定性 稳定,相等元素相对位置不变
空间复杂度 O(1),原地排序
时间复杂度(最好) O(n),数组已有序时
时间复杂度(平均) O(n²),一般情况
时间复杂度(最坏) O(n²)数组完全逆序
适用场景 小规模数据、基本有序数据,实际应用中适用于小数组

代码实现

一、基础版

复制代码
public class InsertionSortBasic {

    /**
     * 插入排序基础实现
     * @param arr 待排序数组
     */
    public static void insertionSort(int[] arr) {
        int n = arr.length;

        // 从第二个元素开始(索引1),因为第一个元素默认已排序
        for (int i = 1; i < n; i++) {
            System.out.println("第 " + i + " 轮,处理元素: " + arr[i]);

            // 当前要插入的元素
            int key = arr[i];
            // 从当前元素的前一个位置开始比较
            int j = i - 1;

            // 将比key大的元素向后移动
            while (j >= 0 && arr[j] > key) {
                System.out.println("  移动 " + arr[j] + " 到位置 " + (j + 1));
                arr[j + 1] = arr[j];  // 元素后移
                j--;  // 继续向前比较
            }

            // 将key插入到正确位置
            arr[j + 1] = key;
            System.out.println("  插入 " + key + " 到位置 " + (j + 1));
            System.out.println("  当前数组: " + java.util.Arrays.toString(arr));
        }
    }

    public static void main(String[] args) {
        int[] arr = {5, 2, 4, 6, 1, 3};
        System.out.println("原始数组: " + java.util.Arrays.toString(arr));
        System.out.println("开始插入排序:\n");

        insertionSort(arr);

        System.out.println("\n最终排序结果: " + java.util.Arrays.toString(arr));
    }
}

二、优化版本(减少赋值操作)

复制代码
public class OptimizedInsertionSort {

    /**
     * 优化版插入排序 - 使用元素交换代替后移操作
     * 代码更简洁,但性能稍差(交换操作比赋值多)
     */
    public static void insertionSortOptimized(int[] arr) {
        int n = arr.length;

        for (int i = 1; i < n; i++) {
            System.out.println("第 " + i + " 轮,处理元素: " + arr[i]);

            // 从当前位置向前比较并交换
            for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) {
                // 交换相邻元素
                swap(arr, j, j - 1);
                System.out.println("  交换 " + arr[j] + " 和 " + arr[j - 1] + 
                                 " → " + java.util.Arrays.toString(arr));
            }
        }
    }

    /**
     * 交换数组中的两个元素
     */
    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void main(String[] args) {
        int[] arr = {5, 2, 4, 6, 1, 3};
        System.out.println("原始数组: " + java.util.Arrays.toString(arr));
        System.out.println("开始优化插入排序:\n");

        insertionSortOptimized(arr);

        System.out.println("\n最终排序结果: " + java.util.Arrays.toString(arr));
    }
}

插入排序虽然在大数据量下效率不高,但其简单性、稳定性和对小数据的高效性使其在实践中仍有重要地位!

++架构设计之道在于在不同的场景采用合适的架构设计,架构设计没有完美,只有合适。++
++在代码的路上,我们一起砥砺前行。用代码改变世界!++

  • 工作 3 年还在写 CRUD,无法突破技术瓶颈?
  • 想转技术管理但不会带团队?
  • 想跳槽没有面试的机会?
  • 不懂如何面试,迟迟拿不到 offer?
  • 面试屡屡碰壁,失败原因无人指导?
  • 在竞争激烈的大环境下,只有不断提升核心竞争力才能立于不败之地。

欢迎从事编程开发、技术招聘 HR 进群,欢迎大家分享自己公司的内推信息,相互帮助,一起进步!

------ 斩获心仪Offer,破解面试密码 ------

相关推荐
Zhao-Jichao11 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
zzu123zsw12 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
学逆向的12 小时前
C 局部静态变量
c语言·开发语言·网络安全
大都督会赢的12 小时前
C++第一节课
开发语言·c++
UIU11412 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
“AI国潮设计-小江”12 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
源码集结号12 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
努力的小雨13 小时前
给 AI 眼镜开发应用有多难?我从零做了一个陪练,还上架了
后端
小王C语言13 小时前
Qt常用控件:容器类控件,标题分组框、标签页(浏览器标签)
开发语言·qt
论文复现现场13 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算