InsertSort 插入排序
# 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变量着手. 以每次所需要对比的值为中心,
当对比成功则中心前移. 对比失败(或无对比), 则把手上揣的值放在中心后面.
插入排序和 选择排序:
两种排序方式都是定义了一个变量, 将当前需要比对的值与其他位数进行比对.
插入排序只用了一次遍历, 然后又用了一次循环.
不同的是, 插入排序循环时, 不一定循环整个列表.
相对来说, 这里循环更有优势.
插入排序的循环次数是逐渐增加, 这和选择\冒泡相反.
和选择\冒泡排序相对比, 插入排序上在写法上有所限制.
例如:
在使用选择或者冒泡的时候, 因为内层计算也是全遍历. 所以,
(同样性能的前提/某列表从小到大的排序)
我可以左边开始, 比较最大的值放在最右边.也可以从右边开始比较最小的值放在最左边.(当然,这样太任性,为了可读性,请不要这样做)