Python实现插入排序算法

插入排序是一种简单的排序算法,它的基本思路是模拟人们整理扑克牌的过程。该算法将数据分为已排序和未排序两部分,初始时已排序部分只有一个元素,然后逐步将未排序部分的元素插入到已排序部分的合适位置,直到未排序部分为空。

插入排序的基本步骤

插入排序的主要步骤如下:

  1. 从第二个元素开始,假设第一个元素是已排序的。
  2. 将当前元素与已排序部分从后往前进行比较,寻找合适的位置。
  3. 如果发现已排序部分的元素大于当前元素,就将该元素后移一个位置。
  4. 将当前元素插入找到的位置。
  5. 重复上述步骤,直到所有元素完成排序。

插入排序的代码实现

下面是用Python实现插入排序的示例代码:

def insertion_sort(arr):
    # 遍历每个元素
    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
        # 插入当前元素
        arr[j + 1] = key
        
    return arr

# 示例用法
if __name__ == "__main__":
    sample_array = [12, 11, 13, 5, 6]
    sorted_array = insertion_sort(sample_array)
    print("排序后的数组:", sorted_array)

复杂度分析

插入排序的时间复杂度为:

  • 最优时间复杂度: O(n) (当待排序序列基本有序时)
  • 平均时间复杂度: O(n^2) (待排序序列无序时)
  • 最坏时间复杂度: O(n^2) (当待排序序列反序时)

空间复杂度为O(1),因为只需要常量的额外空间。

插入排序的可视化

为了更好地理解插入排序的过程,我们可以用关系图和序列图来展示其动态变化。

关系图

erDiagram
    InsertionSort {
        Integer array
        Integer key
        Integer index
        Integer sorted_part
        Integer unsorted_part
    }

在这个示意图中,InsertionSort类中有一个数组arraykey指当前要插入的元素,index用来追踪位置,sorted_part代表已排序部分,unsorted_part代表未排序部分。

序列图

sequenceDiagram
    participant A as 已排序部分
    participant B as 当前元素
    participant C as 位置
    participant D as 未排序部分

    B->>C: 寻找合适的位置
    alt 位置找到
        A->>C: 移动大于当前元素的元素
        C->>B: 插入当前元素
    else 未找到位置
        D->>C: 进入下一个元素
    end

该序列图表示插入排序过程中的各个组件之间的交互,展示了如何在已排序部分插入当前元素。

结语

插入排序作为一种简单直观的排序算法,对于小规模数组或近乎有序的数组表现良好。尽管在处理大规模数据时效率不高,但其易于理解和实现的特性使其在实际应用中仍有其价值。通过对插入排序的学习,不仅加深了对排序算法的理解,也为后续学习更复杂算法打下了良好的基础。希望通过这篇文章,你能对插入排序有一个全面的认识!