插入排序(Insertion Sort)

插入排序(Insertion Sort)是一种简单直观的排序算法,它的工作原理如下:

  1. 将数组分为已排序部分和未排序部分:初始时,已排序部分仅包含数组的第一个元素,其余元素被视为未排序部分。

  2. 从未排序部分取出第一个元素 :将未排序部分的第一个元素暂存于一个变量(如key)中。

  3. key元素与已排序部分进行比较并插入 :从已排序部分的末尾开始,向前遍历,将key与每个元素逐个比较。如果key小于当前元素,则将当前元素向后移动一位,直至找到key的正确插入位置。将key插入该位置,完成一轮插入。

  4. 重复以上过程:接着从未排序部分取出下一个元素,重复步骤2和3。每次插入后,已排序部分的长度增加1,未排序部分的长度减1。

  5. 遍历完整个数组:持续进行上述过程,直至未排序部分为空,即整个数组排序完成。

时间复杂度

  • 最好情况(输入数组已经是有序的):只需进行一次遍历即可确认数组有序,无需进行任何移动,此时时间复杂度为 O(n)。
  • 最坏情况(输入数组逆序排列):需要进行 n-1 轮遍历,每轮都需要进行 n-i 次移动(i 表示当前轮次),因此总的移动次数为 n(n−1)/2,时间复杂度为 O(n2)。
  • 平均情况:时间复杂度也为 O(n2)。

空间复杂度:插入排序是原地排序算法,只需要常数级别的额外空间用于临时存储待插入的元素,因此空间复杂度为 O(1)。

稳定性:插入排序是稳定的排序算法,即相同值的元素在排序前后相对位置不会改变。

插入排序在处理小规模数据或部分有序数据时,表现良好。对于大规模数据,由于其时间复杂度较高,效率不如快速排序、归并排序等高级排序算法。下面是插入排序的Python实现:

复制代码
1def insertion_sort(arr):
2    n = len(arr)
3
4    # 遍历数组中的所有元素
5    for i in range(1, n):
6        
7        # 将当前元素(arr[i])暂存于变量key中
8        key = arr[i]
9
10        # 将key元素与已排序部分进行比较并插入
11        j = i - 1
12        while j >= 0 and key < arr[j]:
13            arr[j + 1] = arr[j]  # 将当前元素向后移动一位
14            j -= 1  # 继续向前比较
15
16        arr[j + 1] = key  # 将key插入正确位置
17
18    return arr

插入排序的基本逻辑,遍历数组并将每个元素插入到已排序部分的正确位置。每次插入后,已排序部分的长度增加1,直至整个数组排序完成。

相关推荐
飞哥不鸽6 分钟前
《leetcode-runner》如何手搓一个debug调试器——引言
算法·leetcode·开源·调试器·插件开发·项目架构
元_汐13 分钟前
【Python通过UDP协议传输视频数据】(界面识别)
开发语言·网络·python·网络协议·tcp/ip·udp
深图智能14 分钟前
OpenCV实现彩色图像的直方图均衡化
图像处理·opencv·算法·计算机视觉
多多*1 小时前
线程池相关 FutureTask介绍 处理阻塞 Future改进->CompletableFuture
java·开发语言·后端·python·spring
siy23331 小时前
[c语言日寄]c语言也有“回”字的多种写法——整数交换的三种方式
c语言·开发语言·笔记·学习·算法
van叶~1 小时前
算法妙妙屋-------2..回溯的奇妙律动
c++·算法
闲人编程3 小时前
PID控制器 (Proportional-Integral-Derivative Controller) 算法详解及案例分析
python·算法·pid·路径规划·微分控制·积分控制·比例控制
诚丞成3 小时前
字符串算法篇——字里乾坤,算法织梦,解构字符串的艺术(下)
c++·算法
我想学LINUX4 小时前
【2024年华为OD机试】(C卷,100分)- 攀登者1 (Java & JS & Python&C/C++)
java·c语言·javascript·c++·python·游戏·华为od
自信的小螺丝钉6 小时前
Leetcode 279. 完全平方数 动态规划 完全背包问题
算法·leetcode·动态规划