插入排序

插入排序是一种简单的排序算法,其基本思想是将一个数据元素插入到已排序的序列中,从而得到一个新的已排序序列。下面是对你提供的 Swift 中的插入排序算法的详细讲解。

插入排序的原理

  1. 已排序部分: 插入排序从数组的第二个元素开始,将前面的元素视为已排序部分。
  2. 选择元素: 对于每个未排序的元素,将其与已排序部分的元素比较。
  3. 移动元素: 如果已排序部分中的元素大于当前元素,则将该元素后移。
  4. 插入当前元素: 找到合适的位置后,将当前元素插入。

代码解析

下面是你提供的代码,并逐步解释每一部分:

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
    }
}

步骤详解

  1. 初始化:

    • let n = array.count:获取数组的长度,方便后续遍历。
    • for i in 1 ..< n:从数组的第二个元素(索引1)开始遍历到最后一个元素。
  2. 选择当前元素:

    • let current = array[i]:取出当前要插入的元素。
  3. 确定插入位置:

    • var preIndex = i - 1preIndex 指向已排序部分的最后一个元素。
  4. 移动元素:

    • while preIndex >= 0 && array[preIndex] > current:这个循环的作用是:
      • preIndex 大于等于0(确保没有越界)并且 array[preIndex](已排序部分的元素)大于 current(当前要插入的元素)时,进入循环。
      • array[preIndex + 1] = array[preIndex]:将 array[preIndex] 后移一位,以为 current 腾出位置。
      • preIndex -= 1:将 preIndex 向前移动一个位置,继续比较。
  5. 插入当前元素:

    • 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),但对于小规模数据或基本有序的数据,插入排序往往表现良好。

posted @   looxy  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示