插入排序
插入排序是一种简单的排序算法,其基本思想是将一个数据元素插入到已排序的序列中,从而得到一个新的已排序序列。下面是对你提供的 Swift 中的插入排序算法的详细讲解。
插入排序的原理
- 已排序部分: 插入排序从数组的第二个元素开始,将前面的元素视为已排序部分。
- 选择元素: 对于每个未排序的元素,将其与已排序部分的元素比较。
- 移动元素: 如果已排序部分中的元素大于当前元素,则将该元素后移。
- 插入当前元素: 找到合适的位置后,将当前元素插入。
代码解析
下面是你提供的代码,并逐步解释每一部分:
func insertionSort(_ array: inout [Int]) {
let n = array.count // 获取数组的长度
for i in 1 ..< n { // 从第二个元素开始(索引1)
let current = array[i] // 当前要插入的元素
var preIndex = i - 1 // 已排序部分的最后一个元素的索引
// 移动已排序部分中比 current 大的元素
while preIndex >= 0 && array[preIndex] > current {
array[preIndex + 1] = array[preIndex] // 后移元素
preIndex -= 1 // 移动到前一个元素
}
// 将 current 插入到合适的位置
array[preIndex + 1] = current
}
}
步骤详解
-
初始化:
let n = array.count
:获取数组的长度,方便后续遍历。for i in 1 ..< n
:从数组的第二个元素(索引1)开始遍历到最后一个元素。
-
选择当前元素:
let current = array[i]
:取出当前要插入的元素。
-
确定插入位置:
var preIndex = i - 1
:preIndex
指向已排序部分的最后一个元素。
-
移动元素:
while preIndex >= 0 && array[preIndex] > current
:这个循环的作用是:- 当
preIndex
大于等于0(确保没有越界)并且array[preIndex]
(已排序部分的元素)大于current
(当前要插入的元素)时,进入循环。 array[preIndex + 1] = array[preIndex]
:将array[preIndex]
后移一位,以为current
腾出位置。preIndex -= 1
:将preIndex
向前移动一个位置,继续比较。
- 当
-
插入当前元素:
array[preIndex + 1] = current
:这个步骤将current
插入到合适的位置。
示例
考虑一个数组 [5, 2, 4, 6, 1, 3]
,我们逐步执行插入排序:
-
第一轮 (
i = 1
,current = 2):- 已排序部分
[5]
- 5 > 2,后移 5,结果变为
[5, 5, 4, 6, 1, 3]
- 插入 2,结果为
[2, 5, 4, 6, 1, 3]
- 已排序部分
-
第二轮 (
i = 2
,current = 4):- 已排序部分
[2, 5]
- 5 > 4,后移 5,结果变为
[2, 5, 5, 6, 1, 3]
- 插入 4,结果为
[2, 4, 5, 6, 1, 3]
- 已排序部分
-
第三轮 (
i = 3
,current = 6):- 已排序部分
[2, 4, 5]
- 6 不小于 5,直接插入,结果为
[2, 4, 5, 6, 1, 3]
- 已排序部分
-
第四轮 (
i = 4
,current = 1):- 已排序部分
[2, 4, 5, 6]
- 6 > 1,后移 6,结果变为
[2, 4, 5, 6, 6, 3]
- 5 > 1,后移 5,结果变为
[2, 4, 5, 5, 6, 3]
- 4 > 1,后移 4,结果变为
[2, 4, 4, 5, 6, 3]
- 2 > 1,后移 2,结果变为
[2, 2, 4, 5, 6, 3]
- 插入 1,结果为
[1, 2, 4, 5, 6, 3]
- 已排序部分
-
第五轮 (
i = 5
,current = 3):- 已排序部分
[1, 2, 4, 5, 6]
- 6 > 3,后移 6,结果为
[1, 2, 4, 5, 6, 6]
- 5 > 3,后移 5,结果为
[1, 2, 4, 5, 5, 6]
- 4 > 3,后移 4,结果为
[1, 2, 4, 4, 5, 6]
- 插入 3,最终结果为
[1, 2, 3, 4, 5, 6]
- 已排序部分
总结
插入排序是一种简单直观的排序算法,尽管在最坏情况下的时间复杂度为 O(n^2),但对于小规模数据或基本有序的数据,插入排序往往表现良好。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具