刚参考网上的以及书上的资料把这八大算法又复习了一遍,感悟就是:有些算法原理真的很简单,一看就懂,但实现起来总是有这样那样的问题。
闲言少叙,先贴代码,之后再以自己的理解,以及自己在理解与实现的过程中遇到的坑,以自己的话记录下来。为了以后复习的方便,也可能给遇到同样坑的人提供些许的思路!
#coding:utf-8 #author:徐卜灵 #1.直接插入排序 L = [1, 3, 2, 32, 15, 5, 4] def Insert_sort(L): for i in range(1,len(L)): for j in range(0,i):#这里面其实也是从前向后比较 if L[i]<L[j]: L.insert(j,L[i])#在不大于的位置插入L[i],这个时候,列表加长了1位,L[i]插入到指定位置了,但它的值也向后移动了一位 L.pop(i+1)#把原来L[i]的值删除。 print L #空间复杂度为O(1),时间复杂度为O(n*n) Insert_sort(L) # print sorted(L)#自带的两种排序 # L.sort() # print L
思路:直接插入排序是比较简单的算法了。需要注意的是,L.insert(j,L[i])这样在适当的位置插入了L[i],同时j后面的元素都往后移动了一位,原来的L[i] 变成了L[i+1],仍然在列表里,所以有一步删除的操作。
这里L.insert(j,L[i]) 和L.pop(i+1)是理解整个算法的关键。
所以算法的空间复杂度为O(1)
时间复杂度,从程序中可以看出循环里嵌套了一层循环,所以为O(n ** 2).
此算法为稳定排序算法。