插入排序 Insertion Sort是一种简单直观的排序算法。
工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
别和选择排序搞混
- 选择排序是从后面【乱序】的数中拿一个放在前面【已排好序】的最后位置
- 插入排序是从后面【乱序】的数中拿一个放在前面【已排好序】的指定位置
实现:
# 方法一
def insert_sort(alist):
"""插入排序"""
length = len(alist)
for iter_num in range(1, length):
# 取出当前数的索引, 和他前面的元素作比较
for index in range(iter_num, 0, -1):
if alist[index] < alist[index-1]:
alist[index], alist[index-1] = alist[index-1], alist[index]
else: # 代表以排序完毕
break
# 方法二
def insert_sort(list):
list_len = len(list)
for idx in range(1, list_len):
print("已排序:", list[: idx])
while idx > 0:
if list[idx] < list[idx - 1]:
list[idx], list[idx - 1] = list[idx - 1], list[idx]
idx -= 1
else:
break
print("结果:", list)
if __name__ == "__main__":
alist = [54,26,93,17,77,31,44,55,20]
insert_sort(alist)
print(alist)
时间复杂度
- 最优时间复杂度:O(n) (升序排列,序列已经处于升序状态)
- 最坏时间复杂度:O( n 2 n^2 n2)
- 稳定性:稳定