插入排序算法(Insert Sort)
插入排序算法的原理:把未排序的序列分成两部分,即有序部分和无序部分(一般把序列的第一个元素当作有序部分,剩余的当作无序部分),然后依次从无序部分取出一个元素与有序部分的每个元素比较,然后在有序部分的合适位置插入,直到整个序列有序。
插入排序算法的原理与选择算法的原理比较
插入排序算法的原理与选择排序算法的原理很相似,都是将待排序序列分成两部分(有序部分和无序部分);
区别在于:
- 选择排序是在无序部分进行比较的,从无序部分取出的值已经是无序部分的最大或者最小值了,就可以直接放在有序部分的头部或者尾部;
- 插入排序是在有序部分进行比较的,从无序部分取出的值是按照无序部分的元素顺序取出,还得跟有序部分的元素进行比较才可知放在哪个位置。
插入排序算法的python实现
代码如下:
第一种:从有序部分的头部开始比较从无序部分取出的值
def insert_sort(alist):
"""插入排序"""
# 外循环从右边无序序列中取值
for right in range(1, len(alist)):
target = alist[right]
# 内循环将从右边取的值与左边的有序序列的值比较(左边的值从头开始比较)
for left in range(0, right):
if target < alist[left]:
alist[left+1:right+1] = alist[left:right]
alist[left] = target
break
return alist
第二种:从有序部分的尾部开始往前比较从无序部分取出的值
def insert_sort2(alist):
# 外循环从右边无序序列取出多少个元素执行内循环的执行过程
for j in range(1, len(alist)):
# i 代表内循环的起始值
i = j
# 执行从右边的无序序列中取出第一个元素,即i位置的元素,然后将其插入到前面的正确位置
# 内循环:将右边取的值,与左边有序序列的值比较(左边的值从后往前开始比较)
while i > 0:
if alist[i] < alist[i-1]:
alist[i], alist[i-1] = alist[i-1], alist[i]
i -= 1
else:
break
return alist
插入排序算法的时间复杂度与稳定性
- 最优时间复杂度:O(n) -->n 指外循环的循环次数(n-1)
- 最坏时间复杂度:O(n2)
- 稳定性:稳定