插入排序

原理

# 插入排序的原理就好比我们打牌时,需要将摸到的牌按照顺序放的时候,那种排序的原理。
# 手里的牌肯定都是已经排序好的。摸到一张新牌时,判断这张新牌放在哪个合适的位置。
# 在列表排序中,就是将无序区的数依次取出来,和有序区的数字比较,确定合适的位置,然后将这个数字插进去。
# 默认列表第一个位置上的数是手里的牌(有序区)。后面的数是都是将要摸到的新拍(无序区)

代码实现

插入排序时间复杂度:O(n^2)

# -*- coding: utf-8 -*-
# created by X. Liu on 2020/3/9

def insert_sort(li):
    for i in range(1, len(li)):     # i是将要插入的数字的索引,从1开始,直到列表最后一个数
        tmp = li[i]                 # 这里需要将手里的牌先保存下来,避免寻找合适位置时把这个数覆盖掉
        j = i - 1                   # j 初始是有序区最大的那个数的索引,也就是i前面那个
        while j >= 0 and li[j] > tmp:    
            li[j+1] = li[j]         # 满足条件时,将有序区的数字往右移目的是腾出空位放tmp
            j -= 1                  # 再将j 往左移位,准备判断有序区第二大的数字和tmp的大小
        li[j+1] = tmp               # 退出循环表示找到了合适的位置
    return li
       
# while循环的目的是为了确定插入tmp的位置 
# 循环条件:
#   (1) j>=0: 判断的是当j=-1,此时表示刚摸到的那个数,比有序区最小的数(列表第一个元素)还小,当不满足该条件时退出循环,表示已经比较大到列表的第一个位置了,此时j等于-1,应该退出循环,将摸到的数插在第一个位置,即0位置(此时,j+1=0)
#   (2) li[j] > tmp,此时新摸到的那个数小于j位置上的数,j位置上应该右移。如果不满足这个条件,说明找到的合适的位置插入新数,此时还是 j+1那个位置存新数

动画演示

posted @ 2020-03-09 21:27  the3times  阅读(190)  评论(0编辑  收藏  举报