1、原理特点
- 插入排序维持一个已排好序的子列表,其位置始终在列表的前部,然后逐步扩大这个子列表直到全表。
- 插入排序的比对主要用来寻找“新项”的插入位置。
原理图:
>思路:
- 第1趟,子列表仅包含第1个数据项,将第2个数据项作为“新项”插入到子列表的合适位置中,这样已排序的子列表就包含了2个数据项。
- 第2趟,再继续将第3个数据项跟前2个数据项比对,并移动比自身大的数据项,空出位置来,以便加入到子列表中
- 经过n-1趟比对和插入,子列表扩展到全表,排序完成。
2、简单排序代码
'''
@ time :2021年10月21日
@ author : wupke
@ description: 插入排序算法
'''
import time
# # #
start1 = time.clock()
def insertionSort(alist):
for index in range(1,len(alist)):
# 从列表的第二项开始,算 新项/插入项
currentvalue = alist[index]
position = index
# 对比移动
while position > 0 and alist[position-1] > currentvalue:
alist[position]=alist[position-1]
position = position-1
# 插入新项
alist[position]= currentvalue
alist = [22,33,44,55,21,31,45,76,88,54,3,5,7,2]
insertionSort(alist)
print(alist)
end1 = time.clock()
print("%s排序用时%s" %(alist,(end1-start1)))
3、复杂度分析
- 最差情况是每趟都与子列表中所有项进行比对,总比对次数与冒泡排序相同,数量级仍是O(n2)
- 最好情况,列表已经排好序的时候,每趟仅需1次比对,总次数是O(n)