1.插入排序
1.1 基本概念
- 需要将原始序列分成两部分:有序部分,无序部分
- 注意:初始情况下,有序部分为乱序序列的第一个元素,无序部分为乱序序列的n-1个元素
1.2 插入排序执行步骤有
- 移除:移除要比较的值
- 对比:对比移除的值
- 平移:平移对比大于移除的值
- 插入:插入移除的值
1.3 对于5个元素的值步骤次数
次数 | 第一轮回 | 第二轮回 | 第三轮回 | 第四轮回 |
---|
移除次数 | 1 | 1 | 1 | 1 |
比较次数【按照最多交换次数计算】 | 1 | 2 | 3 | 4 |
平移次数【按照最多交换次数计算】 | 1 | 2 | 3 | 4 |
插入次数 | 1 | 1 | 1 | 1 |
- 总步骤为:
(4+3+2+1)*2+1*4*2=28
1.4 插入排序大O记法表示
- 对于N个元素:
- 总步数为:
N
2
+
2
N
−
2
N^2+2N-2
N2+2N−2
步骤 | 大约次数 |
---|
移除次数 | N-1 |
比较次数【按照最多比较次数计算】 |
N
2
2
\frac{N^2}{2}
2N2 |
平移次数【按照最多平移次数计算】 |
N
2
2
\frac{N^2}{2}
2N2 |
插入次数 | N-1 |
- 大O记法原则
- 插入排序大O记法表示
- O(
N
2
+
2
N
−
2
N^2+2N-2
N2+2N−2)
- 忽略常数简化为O(
N
2
+
N
N^2+N
N2+N)
- 只保留最高阶简化为O(
N
2
N^2
N2)
- 总结:插入排序大O记法表示为O(
N
2
N^2
N2)
2. 将[4,2,7,1,3]进行插入排序 【实战】
2.1 第一次轮回步骤
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/144211bf74026c8ee13c9db8cf66a395.png#pic_center)
2.2 第二次轮回步骤
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a835b8205299bbe827f0d6e0a3fe75ef.png#pic_center)
2.3 第三次轮回步骤
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/211f4716aa7fadbaf23d07c331b383c1.png#pic_center)
2.4 第四次轮回步骤
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5c73310229a2ef23d63f500c566ab032.png#pic_center)
3.插入排序代码实现
alist = [4, 2, 7, 1, 3]
def insert(alist):
for i in range(1, len(alist)):
position = i
temp_value = alist[i]
while position > 0:
if alist[position - 1] > temp_value:
alist[position] = alist[position - 1]
position -= 1
else:
break
alist[position] = temp_value
print(f"第{i + 1}次轮回结果为:", alist)
insert(alist)
alist = [4, 2, 7, 1, 3]
def insert(alist):
j = 1
for i in range(1, len(alist)):
temp_value = alist[i]
while i > 0:
if alist[i - 1] > temp_value:
alist[i] = alist[i - 1]
i -= 1
else:
break
alist[i] = temp_value
print(f"第{j}次轮回结果为:", alist)
j += 1
insert(alist)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e3086a1bb1325a451680dadca176e5cb.png#pic_center)