插入排序
算法原理:
- python顺序表插入法排序:插入排序的主要思想是每次取一个列表元素与列表中已经排序好的列表段进行比较,然后插入从而得到新的排序好的列表段,最终获得排序好的列表
优点:稳定,快;
缺点:比较次数不一定,比较次数越多,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。
算法复杂度:
- 如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。
'''
Creat by HuangDandan
2018-08-11
dandanhuang@sjtu.edu.cn
顺序表直接插入法排序
将列表中的一个元素与已经排序过的列表中的元素进行比较,如果前面已经排序的列表中的元素比这个元素大,则顺序后移,直到找到插入的位置j
比较的时候注意,是将列表中位置i的元素和已经排序好的列表的最后一个元素(位置j-1)进行比较,如果比该最后一个我元素大,则不移动在原位置即可,也不需要找插入的位置
如果比最后一个元素小,需要找插入的位置,原来已经排序好的元素需要顺序后移
'''
#--------------------实现1元素移动法---------------------------
#一层for循环,一层while循环
def InsertSort(Lst):
for i in range(1, len(Lst)):
x = Lst[i]
j = i
while j > 0 and Lst[j-1] > x: #找合适的插入位置,采用元素后移法,循环结束的时候插入的位置下表为j,元素后移法最后需要将插入的位置放入最小的值,如果不进入循环最小值还是原来的数
Lst[j] = Lst[j-1] #元素后移(元素后移法)
j -= 1
Lst[j] = x
#--------------------实现2元素交换法---------------------------
#一层for循环,一层while循环
def InsertSort(Lst):
times = 0 #排序的次数
for i in range(1, len(Lst)):
x = Lst[i]
j = i
while j > 0 and Lst[j-1] > x: #找合适的插入位置,采用元素交换法
Lst[j], Lst[j-1] = Lst[j-1], Lst[j] #元素交换法
j -= 1
times += 1 #排序的次数
#调试每次输出的结果
print('Lst{}: {}'.format(times, Lst))
''''
下面采用的是两层for循环编写
'''
def InsertSort(Lst):
for i in range(1, len(Lst)):
x = Lst[i]
j = i
for j in range(i, -1, -1):
if Lst[j - 1] > x:
Lst[j] = Lst[j - 1]
else:
break
Lst[j] = x
# #有问题程序!原因在于将程序中比较大小Lst[j-1] > Lst[i]和赋值这里有问题,在while循环里面,破坏了原先链表的比较的值,因此应该将这个值储存在一个独立的内存空间内(x)
# def InsertSort(Lst):
# for i in range(1, len(Lst)):
#
# # x = Lst[i] #6
# j = i
#
#
# while j > 0 and Lst[j-1] > Lst[i]:
# Lst[j] = Lst[j-1] #11
# j -= 1 #0
#
#
# Lst[j] = Lst[i] #6
#测试插入法排序
Lst1 = [1, 4, 4, 2, 55, 44, 66, 77, 66, 66, 88]
print(Lst1)
InsertSort(Lst1)
print(Lst1)
参考书籍:裘宗燕 数据结构与算法:Python的语言描述
参考博客:
https://www.jb51.net/article/123664.htm?utm_medium=referral
https://blog.youkuaiyun.com/bitboss/article/details/51559034
https://www.cnblogs.com/chengxiao/p/6104371.html