互联网行业的小白,写博客的目的是为了记录自己的学习过程、对自己学习中所犯的错误做一个总结。由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!
1. 算法原理
插入排序的基本思想是将一个记录插入到已经排好序的有序表中,从而形成一个新的有序表。对于少量元素的排序,插入排序是一个有效的算法。
工作方式像许多人排序一副扑克牌,开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插人左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。这样拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌。
2. 实现步骤
- 从第一个元素开始,该元素被认为是已经排好序的。
- 取下一个元素,在已经排好序的元素中从后往前扫描,如果已排好序的元素大于新元素(待插入的元素),将该元素后移
- 重复步骤2,直到找到已经排好序的元素小于或等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤2,3,4
3. 动画演示
4. 实现模板
def insertSort(Array):
for j in range(1, len(Array)):
key = Array[j]
i = j - 1
while i >= 0 and Array[i] > key:
Array[i + 1] = Array[i]
i -= 1
Array[i + 1] = key
return Array
5. 具体实例
def insertSort(Array):
for j in range(1, len(Array)):
key = Array[j]
i = j - 1
while i >= 0 and Array[i] > key:
Array[i + 1] = Array[i]
i -= 1
Array[i + 1] = key
print(Array)
if __name__ == '__main__':
Array = [5,2,4,6,1,3]
print(Array)
result = insertSort(Array)
运行结果
[5, 2, 4, 6, 1, 3]
[2, 5, 4, 6, 1, 3]
[2, 4, 5, 6, 1, 3]
[2, 4, 5, 6, 1, 3]
[1, 2, 4, 5, 6, 3]
[1, 2, 3, 4, 5, 6]
6. 算法分析
-
插入排序是稳定的,插入排序适合于数据量小、部分数据有序的情况。
-
最好情况是序列已经是升序排列了,在这种情况下,需要进行的比较操作需 ( n − 1 ) (n-1) (n−1)次即可,此时复杂度为 O ( n ) O(n) O(n)。
-
最坏情况就是序列是降序排列,那么此时需要进行的比较共有 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n−1)次。插入排序的赋值操作是比较操作的次数加上 ( n − 1 ) (n-1) (n−1)次,此时复杂度为 O ( n 2 ) O(n^2) O(n2)。
-
插入排序的平均时间复杂度为 O ( n 2 ) O(n^2) O(n2)。
-
插入排序的空间复杂度为 O ( 1 ) O(1) O(1)
码字不易,您的
支持
就是我坚持
下去的动力,一起加油哦。