当前位置:首页 > Python > 正文

Python插入排序算法详解 - 原理、实现与代码示例

Python插入排序算法详解

全面解析插入排序原理、实现步骤、Python代码示例及性能分析

什么是插入排序?

插入排序是一种简单直观的排序算法,它的工作原理类似于我们整理扑克牌的方式。算法将待排序序列分为已排序和未排序两部分,每次从未排序部分取出一个元素,将其插入到已排序部分的正确位置。

插入排序的特点

  • 简单易懂,实现容易
  • 对小规模数据排序效率高
  • 对近乎有序的数据排序效率非常高
  • 稳定排序算法(相同元素位置不变)
  • 原地排序(只需O(1)额外空间)

适用场景

  • 小规模数据排序
  • 输入数据基本有序的情况
  • 作为更复杂算法(如TimSort)的子过程
  • 需要稳定排序且空间有限的场景

插入排序算法步骤

详细步骤

  1. 从第一个元素开始,该元素可以认为已被排序
  2. 取出下一个元素,在已排序序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤2~5直到所有元素排序完成

可视化过程

排序过程示例:

初始: [5, 2, 4, 6, 1, 3]

第1轮: [2, 5, 4, 6, 1, 3]

第2轮: [2, 4, 5, 6, 1, 3]

第3轮: [2, 4, 5, 6, 1, 3]

第4轮: [1, 2, 4, 5, 6, 3]

第5轮: [1, 2, 3, 4, 5, 6]

Python实现插入排序

插入排序Python实现 insertion_sort.py
def insertion_sort(arr):
    """
    插入排序算法实现
    参数:
        arr (list): 待排序的列表
    返回:
        list: 排序后的列表
    """
    # 遍历从1到len(arr)-1
    for i in range(1, len(arr)):
        key = arr[i]  # 当前需要插入的元素
        j = i - 1    # 与当前元素比较的元素索引
        
        # 将比key大的元素向右移动
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        
        # 将key插入到正确位置
        arr[j + 1] = key
    
    return arr

# 测试插入排序
if __name__ == "__main__":
    data = [9, 5, 1, 4, 3, 7, 8, 2, 6]
    print("原始数组:", data)
    sorted_data = insertion_sort(data.copy())
    print("排序后数组:", sorted_data)

代码说明

  • 外层循环:从索引1开始遍历到数组末尾,表示未排序部分的开始
  • key变量:存储当前需要插入的元素值
  • 内层循环:将当前元素与已排序部分比较,找到合适的插入位置
  • 移动元素:将比key大的元素向右移动,为key腾出插入空间
  • 插入操作:当找到合适位置后,将key插入该位置

插入排序算法分析

时间复杂度

  • 最优情况:O(n) - 当输入数组已经有序时
  • 最差情况:O(n²) - 当输入数组完全逆序时
  • 平均情况:O(n²)

空间复杂度

  • O(1) - 插入排序是原地排序算法,只需要常数级的额外空间

稳定性

  • 稳定 - 插入排序不会改变相等元素的相对顺序

与其他排序算法比较

算法 平均时间复杂度 空间复杂度 稳定性 适用场景
插入排序 O(n²) O(1) 稳定 小数据量或基本有序
冒泡排序 O(n²) O(1) 稳定 教学用途,实际应用少
选择排序 O(n²) O(1) 不稳定 小数据量,内存有限
快速排序 O(n log n) O(log n) 不稳定 大数据量,通用排序

插入排序总结

插入排序是一种简单但高效的算法,特别适用于小规模数据或基本有序的数据集。虽然其时间复杂度为O(n²),不适合大规模数据排序,但在特定场景下它比许多O(n log n)的算法更高效。

在实际应用中,插入排序常被用作更高级算法(如TimSort)的子过程,用于处理小型数组。理解插入排序有助于掌握更复杂的排序算法,是算法学习的重要基础。

发表评论