上一次讲到了冒泡排序算法在Python中的实现,现在来讲一下另一个经典算法,插入排序。
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。以下是用Python实现经典插入排序的code。
def insertsort(list):
if list!=None:
if len(list)==1:
pass
else:
for i in range(1,len(list)):
for j in range(i):
if list[j]>list[i]:
list[j],list[i]=list[i],list[j]
list1=[2,1,1,8,4]
insertsort(list1)
print(list1)
在代码中,我们可以看到,在这里我们同样使用了顶层循环和底层循环的双循环机制。首先,我们先来看看底层循环,这里的循环变量是i,而顶层循环i的取值范围{1,n-1}(假设排序对应的序列有n个元素),激活函数是将第i+1个元素与第i+1个元素之前的元素做比较,如果第前者小于被比较的元素,则做换位处理,否则,不做处理;顶层循环是控制循环次数,共计n-1次,当循环到n-1次时,最后一个元素要与前面n-1个已经排列好的元素进行比较,总计比较次数为n*(n-1)/2;每一层顶层循环,都会在{1,i+1}中完成一次排序,后面i+2个元素插入到前面i+1个元素的末尾,在进行排序,故称之为插入排序。
下面来具体看一下每次顶层循环和底层循环计算机对列表操作的返回值:
def insertsort(list):
if list!=None:
if len(list)==1:
pass
else:
for i in range(1,len(list)):
print ('[',i,']')
for j in range(i):
if list[j]>=list[i]:
list[j],list[i]=list[i],list[j]
print ('"',list,'"')
else:
print("+",list,"+")
print('*',list,'*')
list1=[5,4,3,2,1]
insertsort(list1)
print(list1)
其结果为:
[ 1 ] " [4, 5, 3, 2, 1] " [ 2 ] " [3, 5, 4, 2, 1] " " [3, 4, 5, 2, 1] " [ 3 ] " [2, 4, 5, 3, 1] " " [2, 3, 5, 4, 1] " " [2, 3, 4, 5, 1] " [ 4 ] " [1, 3, 4, 5, 2] " " [1, 2, 4, 5, 3] " " [1, 2, 3, 5, 4] " " [1, 2, 3, 4, 5] " * [1, 2, 3, 4, 5] * [1, 2, 3, 4, 5]