Java排序算法之<插入排序>

目录

1、插入排序

2、流程介绍

3、java实现

4、性能介绍


前言

在 Java 中, 冒泡排序(Bubble Sort)选择排序(Selection Sort) 之后,下一个性能更好的排序算法通常是 插入排序(Insertion Sort)

虽然它们的时间复杂度都是 O(n²) ,但在实际应用中,插入排序通常比选择排序和冒泡排序更快,尤其是在处理部分有序数据时表现更优。

总结:Java 排序算法进阶路线

  1. O(n²) 算法(适合学习原理)

    • 冒泡排序(最慢)→ 选择排序 → 插入排序(推荐先学)
  2. O(n log n) 算法(实际应用)

    • 归并排序(稳定)→ 快速排序(最快,但不稳定)→ 堆排序(空间省)
  3. Java 内置排序

    • Arrays.sort():对基本类型用 快速排序 ,对象类型用 归并排序(保证稳定性)。

1、插入排序

Insertion Sort:插入排序是一种简单直观的排序算法,适合小规模数据部分有序数据

1、核心思想

将数组分为 已排序未排序 两部分,逐个将未排序部分的元素插入到已排序部分的正确位置。

2、适合场景

小规模数据或基本有序的数据(如日志按时间插入)。

3、时间复杂度:

最坏情况下为O(N*N),此时待排序列为逆序,或者说接近逆序。
最好情况下为O(N),此时待排序列为升序,或者说接近升序。

4、空间复杂度:O(1)。


2、流程介绍

如下图所示:

步骤:

1.从第一个元素开始,该元素可以认为已经被排序.

2.取下一个元素tem,从已排序的元素序列从后往前扫描.

3.如果该元素大于tem,则将该元素移到下一位.

4.重复步骤3,直到找到已排序元素中小于等于tem的元素.

5.tem插入到该元素的后面,如果已排序所有元素都大于tem,则将tem插入到下标为0的位置.

6.重复步骤2~5.


3、java实现

代码示例如下:

java 复制代码
public class InsertionSort {

    /**
     * 插入排序(升序)
     * @param arr 待排序数组
     */
    public static void insertionSort(int[] arr) {
        if (arr == null || arr.length <= 1) {
            return; // 边界条件:数组为空或长度≤1时无需排序
        }

        // 从第二个元素开始(下标1),默认第一个元素已排序
        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]; // 比 current 大的元素向后移动
                j--;
            }

            // 插入 current 到正确位置
            arr[j + 1] = current;
        }
    }

    public static void main(String[] args) {
        int[] arr = {12, 11, 13, 5, 6};
        System.out.println("排序前: " + Arrays.toString(arr));
        
        insertionSort(arr);
        
        System.out.println("排序后: " + Arrays.toString(arr));
    }
}

输出:

bash 复制代码
排序前: [12, 11, 13, 5, 6]
排序后: [5, 6, 11, 12, 13]

关键步骤解析

  1. 外层循环

    • i = 1 开始(默认 arr[0] 是已排序部分)。

    • 每次迭代处理一个未排序元素 current = arr[i]

  2. 内层循环

    • j = i - 1 开始,反向遍历已排序部分。

    • 如果 arr[j] > current,则将 arr[j] 向后移动一位。

    • 直到找到 arr[j] ≤ current 的位置,此时 j + 1 就是 current 的插入位置。

  3. 插入操作

    • current 放入 arr[j + 1]

4、性能介绍

为什么插入排序比选择排序快?

  1. 比较次数更少:选择排序每一轮都要遍历剩余全部元素找最小值,而插入排序在数据基本有序时只需少量比较。

  2. 提前终止:如果数据已经有序,插入排序内层循环会立即终止(类似冒泡优化版)。

  3. 数据局部性 :插入排序是顺序访问数组,对 CPU 缓存更友好。


总结

  1. 小数组排序

    • Java 的 Arrays.sort() 在子数组长度 ≤ 47 时,会切换到插入排序。
  2. 部分有序数据

    • 如日志按时间插入、游戏排行榜实时更新。
  3. 混合排序算法

    • 快速排序的递归基改用插入排序(如 QuickSort + InsertionSort)。

参考文章:

1、六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序-CSDN博客https://blog.csdn.net/weixin_50886514/article/details/119045154?ops_request_misc=%257B%2522request%255Fid%2522%253A%25220faf03d22b2d125d5f49a4649ad59c85%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=0faf03d22b2d125d5f49a4649ad59c85&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-119045154-null-null.142^v102^control&utm_term=%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F&spm=1018.2226.3001.4187

相关推荐
飛_29 分钟前
解决VSCode无法加载Json架构问题
java·服务器·前端
朝朝又沐沐3 小时前
算法竞赛阶段二-数据结构(36)数据结构双向链表模拟实现
开发语言·数据结构·c++·算法·链表
木棉软糖3 小时前
一个MySQL的数据表最多能够存多少的数据?
java
程序视点4 小时前
Java BigDecimal详解:小数精确计算、使用方法与常见问题解决方案
java·后端
愿你天黑有灯下雨有伞4 小时前
Spring Boot SSE实战:SseEmitter实现多客户端事件广播与心跳保活
java·spring boot·spring
薰衣草23334 小时前
一天两道力扣(6)
算法·leetcode
剪一朵云爱着4 小时前
力扣946. 验证栈序列
算法·
遇见尚硅谷4 小时前
C语言:*p++与p++有何区别
c语言·开发语言·笔记·学习·算法
Java初学者小白4 小时前
秋招Day20 - 微服务
java
天天开心(∩_∩)4 小时前
代码随想录算法训练营第三十二天
算法