插入排序算法

一、基本思想

插入排序通过构建有序序列,对于未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。它重复这个过程直到所有数据都被处理过。

二、示例

java 复制代码
public class InsertionSort {
    public static void main(String[] args) {
        int[] arr = {9, 5, 1, 4, 3};
        insertionSort(arr);
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }

    public static void insertionSort(int[] arr) {
        // 遍历数组中的每一个元素
        for (int i = 1; i < arr.length; i++) {
            int key = arr[i];  // 当前需要插入到前面正确位置的元素
            int j = i - 1;
            
            // 将key与已排序部分的元素进行比较
            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];  // 如果当前元素大于key,则向右移动一位
                j--;
            }
            arr[j + 1] = key;  // 在正确的位置插入key
        }
    }
}

三、代码解析

  • 初始化 :定义一个整数数组arr作为待排序的数据。
  • 外部循环 :使用变量i从数组的第二个元素开始遍历(索引为1)。
  • 内部循环 :使用变量j表示当前元素的前一个位置。如果arr[j]大于key(即arr[i]),则将arr[j]向右移动一位。
  • 插入操作 :当找到合适的位置时(arr[j] <= keyj < 0),将key插入到arr[j + 1]处。
  • 打印结果:排序完成后,输出整个数组来验证排序是否正确。

四、时间复杂度

插入排序的时间复杂度取决于输入数据的初始顺序。我们可以从最好、最坏和平均情况来分析它的时间复杂度。

  1. 最好情况:O(n),当输入数组已经是排序好的。
  • 条件:当输入数组已经是完全有序时,每个元素都不需要移动,只需要进行一次比较即可。
  • 解释:在每一轮迭代中,当前元素与前一个元素比较后发现不需要交换位置,因此每次迭代只进行了一次比较操作。由于总共要处理 n-1 个元素(第一个元素视为已排序),所以总的比较次数为 n-1,即 O(n)。
  1. 最坏情况:O(n^2),当输入数组完全逆序。
  • 条件:当输入数组是逆序排列时,每个新元素都需要与所有已经排序的元素进行比较,并且每次都需要移动之前的所有元素。
  • 解释:对于第 i 个元素,最多可能需要比较 i 次并移动 i-1 个元素。因此,总的操作次数可以表示为 1 + 2 + ... + (n-1),这是一个等差数列求和公式,其结果为 (n-1)n/2,简化后得到 O(n^2)。
  1. 平均情况:O(n^2)。
  • 解释:平均情况下,每个元素大约需要与一半的已排序元素进行比较。尽管实际的比较和移动次数会少于最坏情况,但总体上仍然接近于 O(n^2) 的时间复杂度。

五、空间复杂度

空间复杂度是指执行算法所需要的额外空间大小,通常以输入数据规模 n 的函数形式表示。在分析空间复杂度时,我们主要关注的是除了输入本身之外所使用的辅助空间。

  • 插入排序是一种原地排序算法,因此它的空间复杂度是O(1)。
  • O(1) 表示算法所需的额外空间是一个常数,与输入数据的大小无关。
  • O(n) 表示算法所需的额外空间随输入数据的大小线性增长。
  • 更高的阶数如 O(n^2)、O(n log n) 等,则表示随着输入数据的增长,所需的空间也呈相应的增长趋势。

六、适用场景

  • 插入排序特别适合小规模或部分有序的数据集。
  • 对于大规模数据集来说,由于其时间效率较低,通常不推荐使用。
相关推荐
初晴や6 分钟前
【C++】图论:基础理论与实际应用深入解析
c++·算法·图论
李泽辉_6 分钟前
深度学习算法学习(五):手动实现梯度计算、反向传播、优化器Adam
深度学习·学习·算法
李泽辉_22 分钟前
深度学习算法学习(一):梯度下降法和最简单的深度学习核心原理代码
深度学习·学习·算法
꧁Q༒ོγ꧂25 分钟前
算法详解---大纲
算法
m0_6038887131 分钟前
Scaling Trends for Multi-Hop Contextual Reasoning in Mid-Scale Language Models
人工智能·算法·ai·语言模型·论文速览
Xの哲學34 分钟前
Linux io_uring 深度剖析: 重新定义高性能I/O的架构革命
linux·服务器·网络·算法·边缘计算
comli_cn41 分钟前
残差链接(Residual Connection)
人工智能·算法
Aaron15881 小时前
基于VU13P在人工智能高速接口传输上的应用浅析
人工智能·算法·fpga开发·硬件架构·信息与通信·信号处理·基带工程
予枫的编程笔记1 小时前
【论文解读】DLF:以语言为核心的多模态情感分析新范式 (AAAI 2025)
人工智能·python·算法·机器学习
im_AMBER1 小时前
Leetcode 99 删除排序链表中的重复元素 | 合并两个链表
数据结构·笔记·学习·算法·leetcode·链表