一、插入排序:每一趟将一个待排序的元素,按其关键字的大小插入到已排序序列的适当位置,直到全部插入完成。
常见的插入排序有以下三种。
1、直接插入排序
1)过程:直接插入排序是一种最简单的排序方法,其过程就是依次将每个元素插入到一个有序的序列中去。不过它有个缺点,就是当我们的数据基本有序时,每次插入都要移动位置,此时的插入效率是很低的。为了解决这种情况,又产生了拆半插入排序,希尔排序。
工作原理:插入排序在实现上,从后面向前扫描(一开始从下标为1的元素开始,往下标为0的元素遍历),在扫描过程中,需要反复把已排序元素逐步向后挪位,为最新的元素提供插入位置。
直接插入排序示意图
2)python实现:
def sort3(a):
for i in range(1,len(a)):
for j in range(i,0,-1):
if a[j-1] > a[j]:
a[j],a[j-1] = a[j-1],a[j]
return a
3)复杂度
空间复杂度:O(1)
时间复杂度:
平均 O( )
最好 O(n) :初始数据序列正序时
最坏 O( ) :初始数据序列反序时
2、拆半插入排序
1)过程:对直接插入排序寻找合适插入点时,用了类似二分法的寻位方法
2)python实现:
#折半插入排序=直接插入排序+二分查找
def sort4(a):
for i in range(1,len(a)):
tmp = a[i]
low = 0
high = i-1
#查找位置
while low <= high:
mid = (low + high) // 2
if tmp > a[mid]:
low = mid +1
else:
high = mid -1
#插入元素
for j in range(i,low,-1):
a[j] = a[j-1]
a[low] = tmp
return a
3)复杂度
空间复杂度:O(1)
时间复杂度:
平均 O( )
相比直接插入排序减少了关键字的比较次数,但元素的移动次数不变。
3、希尔排序
1)过程:希尔排序又称缩小增量排序,基本思想:把元素按下标的一定增量d分组,对每组元素采用直接插入排序的方法进行排序,然后随着增量不断减小,直到d为1,整个数据合为一组有序序列。
希尔排序示意图
2)python实现:
def sort5(a):
step = len(a) // 2
while step > 0:
for i in range(step,len(a)):
for j in range(i,0,-step):
if a[j] < a[j-step]:
a[j],a[j-step] = a[j-step],a[j]
step //= 2
return a
3)复杂度
空间复杂度:O(1)
时间复杂度:
平均 O( )
最好 O(n)
最坏 O( )