python:排序算法——插入排序
1、什么是插入排序
插入排序(英文名称:Insertion Sort)是一种简单且直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序数列中从后向前扫描,直到找到相应位置插入即可。
2、工作原理
如果你还是不明白什么是插入排序,那么我将用比百度中更直白的方式讲给大家听。
插入排序的核心所在:将一个无序的列表看成两个数列,假如第一个元素构成了第一个数列,那么余下的元素将构成第二个数列。不难发现,第一个数列是有序的,因为它只有一个元素,那么我们是不是可以将第二个数列中的每个元素依次拿出来,与第一个数列中的元素比较,并依次插入到第一个数列中的合适位置……直到第二个数列中没有元素为止,此时我们就得到了一个有序的数列。
3、动态流程图
4、源码
def insertionsort(list,reverse=False):
"""
该函数用于对列表中的元素进行排序——插入排序
:param list: 列表对象
:param reverse: 为 True 时进行降序排列,为 False 时进行升序排列(默认)
:return: None
"""
# 遍历待排序数列的索引
for i in range(1,len(list)):
# 依次获取待排序数列中的元素
value = list[i]
# 获取有序数列最后一个元素的索引
j = i - 1
# 因为待排序数列中的元素要依次从后往前与有序数列中的元素进行比较,那么就存在一个问题:有序数列的最小索引是啥?我们可以想到,它是在一个列表中活动,那么最小索引肯就就是0,所以不能小于0
while j >= 0:
# 降序排列 大 ==> 小
if reverse:
# 如果待排序元素大于有序数列中的元素
if value > list[j]:
# 那么待排序元素插入到有序元素的前面,并且此时有序元素要后移一位
list[j], list[j+1] = value, list[j]
# 递减有序数列索引计数器
j -= 1
# 否则
else:
# 跳出比较的这个内循环
break
# 升序排列 小 ==> 大
else:
# 如果待排序元素小于有序元素
if value < list[j]:
# 那么待排序元素插入到有序元素的前面,并且此时有序元素要后移一位
list[j], list[j+1] = value, list[j]
# 递减有序数列索引计数器
j -= 1
# 否则
else:
# 跳出比较的这个内循环
break
if __name__ == '__main__':
mylist = [32, 12, 1, 453, 76, 1342, 0, 1, 2]
# 升序排列 小 ==> 大
insertionsort(mylist)
print(mylist)
# 降序排列 大 ==> 小
insertionsort(mylist, reverse=True)
print(mylist)
5、总结
(1)使用场景
**插入排序的使用场景 :**一个新元素需要插入到一组已经是有序的列表中,或者是一组基本上有序的列表排序,那么,此时我们就可以使用插入排序算法。
(2)特点
- 比较性:排序时元素之间需要比较,所以插入排序又称比较排序
- 稳定性:从代码中可以看出,当待排序元素大于或者小于有序元素时,待排序元素将插入到有序元素之前,该有序元素后移,所有相同的元素时不会影响其相对位置
- 时间复杂度:插入排序同样需要两个循环,一个一个依次进行比较,所以时间复杂度为 O(n^2)
- 记忆方法:使用其算法时,我们可以相信成在图书馆的书架中插书,先找到其相应的位置,然后将后面的书往后推,再将该书插入即可