插入排序:
类似于打扑克牌时我们抽牌,每抽到一张牌,就将这张牌插入到手牌指定位置。
有序区 无序区。
有序区就是已经排好序的区域(你手里已经有的牌)。
无序区就是没有排序的区域(牌堆)
每次抽到牌之后,对有序区进行一次类似冒泡的处理,从右向左进行冒泡,直到牌插入到了正确位置。
时间复杂度:O(n^2)
空间复杂度:O(1)
重点:理解有序区和无序区的概念,以及:1个元素自身是有序的。
算法的两个基础概念:O(n)
空间复杂度:所使用的算法占用的内存空间。O(1):没有新开辟的内存空间。O(n):新开一个长度为n的列表或者是其他的数据结构。
时间复杂度:所使用的算法消耗的时间的长度。O(n):对一个长度为n列表进行一次完全的遍历。O(n^2):对一个列表进行嵌套的两次循环。
插入排序(python代码):
import random
li1 = [random.randint(0, 9) for i in range(10)]
def insert_sort(li):
for i in range(1,len(li)) :
while li[i] < li[i-1] and i>0 :
li[i-1],li[i] = li[i],li[i-1]
i -= 1
return li
print(li1)
print(insert_sort(li1))
插入排序注释:
def insert_sort(li):#插入排序
for i in range(1,len(li)):#li[0]只有一个元素,所以他一定是有序的,所以我们从第二个元素开始循环
k=i#初始化一个需要排序的元素的指针。
j=i-1#初始化一个指向有序区最后一个元素的指针。
while li[k]<li[j] and j>=0:#如果我们取出来的数比前面的数字小,则双方交换位置,继续循环。j>=0防止数组越界
li[k],li[j]=li[j],li[k]#交换两个相邻元素。
k-=1
j-=1#把kj通通向左挪一位。