返回

为什么你还没学会插入排序?原来是这样!

前端

导言

算法是计算机科学的基础,排序算法更是其中不可或缺的一部分。插入排序作为一种简单且高效的排序算法,因其易于理解和实现而备受青睐。然而,许多人对插入排序的理解却停留在表面,未能真正掌握其精髓。这篇文章旨在弥补这一差距,为您提供一份全面且深入的插入排序指南。

插入排序原理

插入排序是一种基于比较的排序算法,它将待排序的元素逐个插入到已排序的序列中。其基本思想是:将第一个元素视为已排序序列,然后将剩余元素依次与已排序序列中的元素进行比较,找到合适的位置插入。

插入排序步骤

  1. 初始化: 将第一个元素视为已排序序列。
  2. 比较与插入: 依次将剩余元素与已排序序列中的元素进行比较,找到第一个比当前元素大的元素。
  3. 移动元素: 将已排序序列中比当前元素大的元素依次向后移动一个位置。
  4. 插入: 将当前元素插入已排序序列中空出的位置。
  5. 重复步骤 2-4: 继续对剩余元素重复步骤 2-4,直到所有元素都已插入。

代码实现

以下是用 Python 实现的插入排序代码:

def insertion_sort(arr):
    """插入排序算法

    Args:
        arr (list): 待排序的列表

    Returns:
        list: 排序后的列表
    """
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key
    return arr

示例

假设我们有一个待排序的列表 [5, 2, 8, 3, 1].

  • 第一次循环:
    • 2 插入到已排序的序列中([2])。
  • 第二次循环:
    • 8 插入到已排序的序列中([2, 8])。
  • 第三次循环:
    • 3 插入到已排序的序列中([2, 3, 8])。
  • 第四次循环:
    • 1 插入到已排序的序列中([1, 2, 3, 8])。
  • 第五次循环:
    • 5 插入到已排序的序列中([1, 2, 3, 5, 8])。

最终,我们得到了一个已排序的列表 [1, 2, 3, 5, 8].

复杂度分析

插入排序的平均时间复杂度为 O(n^2),其中 n 为待排序元素的个数。然而,在某些情况下,插入排序的时间复杂度可以降低到 O(n),例如当输入数据已经近似有序时。

应用

插入排序通常用于排序小型数据集或近似有序的数据集。由于其简单性和易于实现,它经常作为初学者学习排序算法的第一个算法。

结语

通过本文对插入排序原理、步骤、代码实现、示例和复杂度分析的深入探讨,您现在已经对这种基本排序算法有了全面的理解。掌握插入排序将为您的算法之旅奠定坚实的基础,并为应对更复杂的算法和数据结构做好准备。