返回

亲自动手插入排序,彻底理解其原理和妙用!

前端

引言

排序算法是计算机科学中的基石,而插入排序就是其中一颗璀璨的明珠。它以其简洁易懂的特性和出色的性能,在解决现实世界问题时大放异彩。

插入排序原理

想象一下你在玩纸牌游戏,手握一副牌。现在你需要按照大小顺序对它们进行排列。你会怎么做?

插入排序的工作原理与此类似。它从一个元素开始,将其插入到适当的位置,然后依次对后续元素进行同样的操作,直到所有元素都按顺序排列。

算法步骤

  1. 初始化: 将第一个元素视为已排序的子数组。
  2. 遍历: 从第二个元素开始,遍历剩余的元素。
  3. 比较: 将当前元素与已排序子数组中的元素逐一比较。
  4. 插入: 找到当前元素的正确位置并将其插入。
  5. 重复: 对剩余元素重复步骤 2-4。

示例

考虑以下数组:5, 3, 1, 2, 4

  • 步骤 1: 初始化已排序子数组为 [5]。
  • 步骤 2: 将 3 与 5 比较,插入到 5 之前。
  • 步骤 3: 将 1 与 [3, 5] 比较,插入到 3 之前。
  • 步骤 4: 将 2 与 [1, 3, 5] 比较,插入到 3 之后。
  • 步骤 5: 将 4 与 [1, 2, 3, 5] 比较,插入到 5 之后。

最终结果:1, 2, 3, 4, 5

时间复杂度

插入排序的时间复杂度为 O(n^2),其中 n 是数组的长度。这意味着随着数组规模的增长,排序时间会显著增加。

空间复杂度

插入排序的空间复杂度为 O(1),因为它不需要额外的空间来存储临时数据。

应用

插入排序在以下场景中非常有用:

  • 小规模数组: 当数组规模较小时,插入排序比其他更复杂算法更有效。
  • 部分已排序的数组: 当数组已经部分排序时,插入排序可以有效地完成剩余的排序。
  • 在线算法: 插入排序适用于数据逐个到达的情况,因为它可以立即处理每个元素。

代码实现

def insertion_sort(arr):
  for i in range(1, len(arr)):
    current_element = arr[i]
    j = i - 1
    while j >= 0 and current_element < arr[j]:
      arr[j + 1] = arr[j]
      j -= 1
    arr[j + 1] = current_element

结语

插入排序是一种简单易懂且高效的算法,特别适用于小规模数组或部分已排序的数组。通过理解其原理并掌握其应用场景,你可以将其作为你编程工具箱中的一项利器。

现在,你已经掌握了插入排序的精髓,赶紧在你的项目中大显身手吧!