插入排序(Insertion Sort)是一种简单的排序算法,它的基本思想是将待排序的元素逐一插入到已排序的部分中,直到所有元素都被插入到正确的位置上。具体过程就像是你在玩扑克牌时,将牌插入到已经排好的牌中一样。
算法步骤:
- 从第二个元素开始,将当前元素与前面已经排序的部分进行比较。
- 找到合适的位置:将当前元素插入到已排序部分中,使得已排序部分仍然是有序的。
- 重复步骤1和2,直到所有元素都被插入到已排序的部分,最终完成排序。
插入排序的伪代码:
for i = 1 to length(A) - 1:
key = A[i] # 选择当前元素
j = i - 1 # 在已排序部分查找位置
while j >= 0 and A[j] > key:
A[j + 1] = A[j] # 将较大的元素往右移动
j = j - 1
A[j + 1] = key # 将当前元素插入合适的位置
示例:
假设有一个数组 A = [5, 2, 9, 1, 5, 6]
,我们使用插入排序进行排序:
- 初始数组 :
[5, 2, 9, 1, 5, 6]
- 第一轮(i=1) :选择
2
,与5
比较,发现2 < 5
,将5
移动到后面,把2
插入到第一个位置。- 结果:
[2, 5, 9, 1, 5, 6]
- 结果:
- 第二轮(i=2) :选择
9
,与5
比较,发现9 > 5
,无需移动,继续下一个元素。- 结果:
[2, 5, 9, 1, 5, 6]
- 结果:
- 第三轮(i=3) :选择
1
,与9
、5
、2
比较,发现1
小于它们,将它们依次移动,将1
插入到最前面。- 结果:
[1, 2, 5, 9, 5, 6]
- 结果:
- 第四轮(i=4) :选择
5
,与9
比较,发现5 < 9
,将9
移动到后面,继续与5
比较,发现相等,无需移动,插入到对应位置。- 结果:
[1, 2, 5, 5, 9, 6]
- 结果:
- 第五轮(i=5) :选择
6
,与9
比较,发现6 < 9
,将9
移动到后面,与5
比较,发现6 > 5
,插入到位置。- 结果:
[1, 2, 5, 5, 6, 9]
- 结果:
最终排序后的数组是 [1, 2, 5, 5, 6, 9]
。
时间复杂度:
- 最坏情况:当输入数组是倒序时,插入排序每次都需要与已经排好的元素进行比较,并将元素移动,时间复杂度是 O(n^2)。
- 最好情况:当输入数组已经是有序的时,每次比较都不需要移动元素,时间复杂度是 O(n)。
- 平均情况:平均时间复杂度为 O(n^2)。
空间复杂度:
插入排序是原地排序算法,其空间复杂度是 O(1)。
优缺点:
- 优点 :
- 算法简单,易于实现。
- 对于小规模的数据排序,性能较好。
- 稳定排序:相等元素的相对位置不会改变。
- 如果输入数组已经基本有序,效率较高(最好情况时间复杂度 O(n))。
- 缺点 :
- 对于大规模数据,性能较差,时间复杂度为 O(n^2)。
- 不适用于大规模的数据排序,效率不如快速排序、归并排序等其他高效排序算法。
插入排序适用于数据量较小或者数据基本有序的情况。