插入排序算法

插入排序(Insertion Sort)是一种简单的排序算法,它的基本思想是将待排序的元素逐一插入到已排序的部分中,直到所有元素都被插入到正确的位置上。具体过程就像是你在玩扑克牌时,将牌插入到已经排好的牌中一样。

算法步骤:

  1. 从第二个元素开始,将当前元素与前面已经排序的部分进行比较。
  2. 找到合适的位置:将当前元素插入到已排序部分中,使得已排序部分仍然是有序的。
  3. 重复步骤1和2,直到所有元素都被插入到已排序的部分,最终完成排序。

插入排序的伪代码:

复制代码
for i = 1 to length(A) - 1:
    key = A[i]  # 选择当前元素
    j = i - 1   # 在已排序部分查找位置
    while j >= 0 and A[j] > key:
        A[j + 1] = A[j]  # 将较大的元素往右移动
        j = j - 1
    A[j + 1] = key  # 将当前元素插入合适的位置

示例:

假设有一个数组 A = [5, 2, 9, 1, 5, 6],我们使用插入排序进行排序:

  1. 初始数组[5, 2, 9, 1, 5, 6]
  2. 第一轮(i=1) :选择 2,与 5 比较,发现 2 < 5,将 5 移动到后面,把 2 插入到第一个位置。
    • 结果:[2, 5, 9, 1, 5, 6]
  3. 第二轮(i=2) :选择 9,与 5 比较,发现 9 > 5,无需移动,继续下一个元素。
    • 结果:[2, 5, 9, 1, 5, 6]
  4. 第三轮(i=3) :选择 1,与 952 比较,发现 1 小于它们,将它们依次移动,将 1 插入到最前面。
    • 结果:[1, 2, 5, 9, 5, 6]
  5. 第四轮(i=4) :选择 5,与 9 比较,发现 5 < 9,将 9 移动到后面,继续与 5 比较,发现相等,无需移动,插入到对应位置。
    • 结果:[1, 2, 5, 5, 9, 6]
  6. 第五轮(i=5) :选择 6,与 9 比较,发现 6 < 9,将 9 移动到后面,与 5 比较,发现 6 > 5,插入到位置。
    • 结果:[1, 2, 5, 5, 6, 9]

最终排序后的数组是 [1, 2, 5, 5, 6, 9]

时间复杂度:

  • 最坏情况:当输入数组是倒序时,插入排序每次都需要与已经排好的元素进行比较,并将元素移动,时间复杂度是 O(n^2)。
  • 最好情况:当输入数组已经是有序的时,每次比较都不需要移动元素,时间复杂度是 O(n)。
  • 平均情况:平均时间复杂度为 O(n^2)。

空间复杂度:

插入排序是原地排序算法,其空间复杂度是 O(1)。

优缺点:

  • 优点
    1. 算法简单,易于实现。
    2. 对于小规模的数据排序,性能较好。
    3. 稳定排序:相等元素的相对位置不会改变。
    4. 如果输入数组已经基本有序,效率较高(最好情况时间复杂度 O(n))。
  • 缺点
    1. 对于大规模数据,性能较差,时间复杂度为 O(n^2)。
    2. 不适用于大规模的数据排序,效率不如快速排序、归并排序等其他高效排序算法。

插入排序适用于数据量较小或者数据基本有序的情况。

相关推荐
Aaron15882 分钟前
电子战侦察干扰技术在反无人机领域的技术浅析
算法·fpga开发·硬件架构·硬件工程·无人机·基带工程
zhglhy22 分钟前
Jaccard相似度算法原理及Java实现
java·开发语言·算法
workflower27 分钟前
PostgreSQL 数据库的典型操作
数据结构·数据库·oracle·数据库开发·时序数据库
仰泳的熊猫38 分钟前
1140 Look-and-say Sequence
数据结构·c++·算法·pat考试
handuoduo12341 小时前
SITAN中avp必要性分析
人工智能·算法·机器学习
zl_vslam1 小时前
SLAM中的非线性优-3D图优化之相对位姿Between Factor右扰动(八)
人工智能·算法·计算机视觉·3d
EXtreme351 小时前
栈与队列的“跨界”对话:如何用双队列完美模拟栈的LIFO特性?
c语言·数据结构·leetcode·双队列模拟栈·算法思维
电饭叔1 小时前
如何代码化,两点之间的距离
笔记·python·算法
TL滕1 小时前
从0开始学算法——第十三天(Rabin-Karp 算法练习)
笔记·学习·算法·哈希算法
松涛和鸣1 小时前
29、Linux进程核心概念与编程实战:fork/getpid全解析
linux·运维·服务器·网络·数据结构·哈希算法