标签:位置 变化 范围 限制 定义变量 它的 ret 保存 bsp
# InsertSort 插入排序_Python实现 def insert_sort(li): for i in range(1, len(li)): # 此处选择从第二个开始且len不减一,因为计算框从i-1开始, 整体需要往后推一格 temp = li[i] # 当前所对比的值 j = i - 1 # 需要对比的开始坐标 while j >= 0 and temp < li[j]: li[j+1] = li[j] j -= 1 li[j+1] = temp # 计算完毕或无计算, 把值放在对比值的后面. 因为在循环中i的值没有发生变化,不考虑可读性时,temp变量可以省去 return li list = [1, 55, 98984, 65, 165, 356, 54, 3, 645, 74, 64, 35] li = insert_sort(list) print(li)
一次遍历, 一次循环.
遍历第一个值a, 下标i, 并定义变量保存a值
用a对比前一个位置的值, (需限制下标范围, 第一次条件必定不成立)
如果a小于对方, 开始循环
把它的值赋予原本a所在的下标(这也是为什么需要变量保存a).
所对比的下标加一.
然后继续循环. 直到a不必前面的值小. 这个时候再将a赋值给当前下标.
理解插入算法, 应该从j变量着手. 以每次所需要对比的值为中心,
当对比成功则中心前移. 对比失败(或无对比), 则把手上揣的值放在中心后面.
两种排序方式都是定义了一个变量, 将当前需要比对的值与其他位数进行比对.
插入排序只用了一次遍历, 然后又用了一次循环.
不同的是, 插入排序循环时, 不一定循环整个列表.
相对来说, 这里循环更有优势.
插入排序的循环次数是逐渐增加, 这和选择\冒泡相反.
和选择\冒泡排序相对比, 插入排序上在写法上有所限制.
例如:
在使用选择或者冒泡的时候, 因为内层计算也是全遍历. 所以,
(同样性能的前提/某列表从小到大的排序)
我可以左边开始, 比较最大的值放在最右边.也可以从右边开始比较最小的值放在最左边.(当然,这样太任性,为了可读性,请不要这样做)
标签:位置 变化 范围 限制 定义变量 它的 ret 保存 bsp
原文地址:https://www.cnblogs.com/jrri/p/12099922.html