插入排序算法

一、基本思想

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

二、示例

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) 等,则表示随着输入数据的增长,所需的空间也呈相应的增长趋势。

六、适用场景

  • 插入排序特别适合小规模或部分有序的数据集。
  • 对于大规模数据集来说,由于其时间效率较低,通常不推荐使用。
相关推荐
江畔柳前堤5 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore6 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考8 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX8 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面9 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号9 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽9 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI9 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者11 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者11 小时前
【征程6】校准量化中HistogramObserver解析
算法