from doublelink import *
def insertsort(source):
dest = doublelinked()
for i in source:
for j in reversed(dest):
if j[0] <= i:
dest.insertafter(j, i)
break
else:
dest.prepend(i)
return tuple(i[0] for i in dest)
print(insertsort((1, 3, 2, 5, 4)))
基于循环双向链表实现的插入排序,循环双向链表见前作基于list实现循环双向链表
让我们来研究一下算法的时间负责度,定义一个函数f(n),它表示n个元素的数值序列进行插入排序的时间负责度,也就是平均比较次数(链表插入不需要移动元素),显然f(1)=0,让我们来研究一下f(n+1)和f(n)的关系,很容易发现f(n+1) 约等于 f(n) + (1+2+...+n)/n,当它们相等进行估算,也就是f(n+1) - f(n) = 1/2 + n/2,列一次差的序列:
f(2) - f(1) = 1/2 + 1/2
f(3) - f(2) = 1/2 + 2/2
.......
f(n+1) - f(n) = 1/2 + n/2
左右两边分别相加得f(n+1) = n/2 + 1/2*(1 + 2 +...+ n) 约等于n^2/4,所以插入排序的时间复杂度是O(n^2)。