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变量着手. 以每次所需要对比的值为中心,
当对比成功则中心前移. 对比失败(或无对比), 则把手上揣的值放在中心后面.

 

插入排序和 选择排序:


两种排序方式都是定义了一个变量, 将当前需要比对的值与其他位数进行比对.
插入排序只用了一次遍历, 然后又用了一次循环.
不同的是, 插入排序循环时, 不一定循环整个列表.
相对来说, 这里循环更有优势.

插入排序的循环次数是逐渐增加, 这和选择\冒泡相反.

和选择\冒泡排序相对比, 插入排序上在写法上有所限制.
例如:
在使用选择或者冒泡的时候, 因为内层计算也是全遍历. 所以,
(同样性能的前提/某列表从小到大的排序)
我可以左边开始, 比较最大的值放在最右边.也可以从右边开始比较最小的值放在最左边.(当然,这样太任性,为了可读性,请不要这样做)

posted @ 2019-12-26 01:17  Jrri  阅读(346)  评论(0编辑  收藏  举报