Python实现插入排序算法
插入排序是一种简单的排序算法,它的基本思路是模拟人们整理扑克牌的过程。该算法将数据分为已排序和未排序两部分,初始时已排序部分只有一个元素,然后逐步将未排序部分的元素插入到已排序部分的合适位置,直到未排序部分为空。
插入排序的基本步骤
插入排序的主要步骤如下:
- 从第二个元素开始,假设第一个元素是已排序的。
- 将当前元素与已排序部分从后往前进行比较,寻找合适的位置。
- 如果发现已排序部分的元素大于当前元素,就将该元素后移一个位置。
- 将当前元素插入找到的位置。
- 重复上述步骤,直到所有元素完成排序。
插入排序的代码实现
下面是用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
类中有一个数组array
,key
指当前要插入的元素,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
该序列图表示插入排序过程中的各个组件之间的交互,展示了如何在已排序部分插入当前元素。
结语
插入排序作为一种简单直观的排序算法,对于小规模数组或近乎有序的数组表现良好。尽管在处理大规模数据时效率不高,但其易于理解和实现的特性使其在实际应用中仍有其价值。通过对插入排序的学习,不仅加深了对排序算法的理解,也为后续学习更复杂算法打下了良好的基础。希望通过这篇文章,你能对插入排序有一个全面的认识!