算法--插入排序

插入排序

列表被分为有序区和无序区两个部分。最初有序区只有一个元素。

每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空。

【就好比打牌,摸牌,手里的牌是有序的,桌子上的牌是无序的,从桌子上最上面摸一张牌,插入到手里的牌里面】


代码关键点:

  • 摸到的牌
  • 手里的牌

 

图一: 红色有序区, 白色无序区

 

 

图二: 从无序区拿出一个值

 

 

图三:

 

 

图四: 插入到有序区

 

 

python代码实现:

li = [1, 2, 3, 7, 5, 9, 4, 8, 1]


def insert_sort(li):
    for i in range(1, len(li)):  # 第一个位置的值初识化为有序区,索引从1开始
        temp = li[i]  # 把无序区第一个位置的值拿出来(新摸到的一张牌)
        j = i - 1  # 有序区最后一个位置的索引
        while j >= 0 and temp < li[j]:  # 两个终止条件: 1.j<0,索引越界,说明temp是最小的
            li[j + 1] = li[j]  # 把有序区最后一个位置的值往后移一格
            j -= 1
        li[j + 1] = temp
        # 两个终止条件: 1. j=-1,说明temp最小,放到最前面
        #              2. 一上来,无序区第一个值就大于有序区最后一个值


insert_sort(li)
print(li)

时间复杂度:O(n2)

空间复杂度:O(1)

优化空间:应用二分查找来寻找插入点(并没有什么卵用)

  注意while j >= 0 and temp < li[j]: 两个条件的顺序

 


布尔运算的短路功能

1 > 2 and 3 < 4 

python做了优化, 前面不满足,后面就不判断了

 

不用if写一个if语句

def func():
    print(11)

a = 1

a < 0 and func()

a > 0 and func()
# 11

 

posted @ 2020-05-14 21:01  静静别跑  阅读(152)  评论(0编辑  收藏  举报