插入排序简介
插入排序也是一种简单的排序算法。
简单来说,先定义一个有序队列,然后把无序队列中的第一个元素放到有序队列的合适位置,重复操作,直至形成一个完整的有序队列
生活实例:打扑克
插入排序原理
1、构建有序序列
2、选择无序队列的第一个元素,先放在有序队列末尾,然后进行冒泡排序,放到指定的位置
3、循环2步,直到无序队列中所有元素全部进入有序队列的合适位置
特点:
插入vs冒泡:
插入排序的有序队列用到了冒泡算法,
区别:
升序情况下:
冒泡:有序队列在后,无序队列在前,
插入:有序队列在前,无序队列在后
插入vs选择:
选择是遍历未排序队列,将最小的元素移动到有序队列的末尾
插入是把无序队列第一个元素放到有序队列,通过使用冒泡算法,移动到合适的位置
总结:
1、刚开始有序队列为空,直接把无序队列的第一个元素放到有序队列里即可
2、如果有序队列有内容,那么把无序队列的第一个元素放到有序队列里,然后有序队列进行冒泡排序
3、需要进行多少次冒泡排序呢?无序队列有几个元素,就进行n-1次有序队列的冒泡排序
通过分析,整个过程包括如下内容:
1、有序队列中元素比较替换 即"元素替换"
2、每次排序,有序队列中元素比较替换的次数 即"比较循环"
3、需要进行多少次排序 即"排序循环"
def insert_sort(alist):
n = len(alist)
for j in range(0, n):
for i in range(j, 0, -1):
if alist[i] < alist[i - 1]:
alist[i], alist[i - 1] = alist[i - 1], alist[i]
else:
break
return alist
if __name__ == '__main__':
alist = [9, 8, 7, 6, 5, 4, 3, 2, 1]
insert_sort(alist)
print("排序后:", alist)
关键点:
1、元素替换:if alist[j] < alist[j-1]
2、比较循环:for j in range(i,0,-1)
3、插入循环:for i in range(n):
时间复杂度
最优时间复杂度:O(n) (升序排列,序列已经处于升序状态)
如果有序队列里的元素正好是已排序的状态,不需要比较替换,那么内部的比较循环的时间复杂度就是O(1)
无序队列中有多少元素,就要进行多少次"比较循环",所以外部排序循环的时间复杂度是O(n)
所以整体来说:最优时间复杂度是O(n)
最坏时间复杂度:O(n2)
如果内部比较循环,需要全部排序,则它的最坏时间复杂度就是O(n)
所以整体来说:最坏时间复杂度是O(n2)
稳定性:稳定
通过示例可以得知,有序队列里面的元素顺序没有做任何变动,所以稳定
思考:
改那个地方,结果是降序?
if alist[j] < alist[j - 1]: 代码中的 < 改为 >
本节内容小结:
1、插入排序原理:无序第一进有序,有序内冒泡,数循环over。
2、插入排序实践步骤:无构有序-有序冒泡-外部插入循环-异常考虑