通过构建有序序列,对于未排序部分,在已排序序列中从后向前扫描,找到相应的位置并插入。
如果输入序列已经是排好序的话,插入排序出现最佳情况。
如果输入序列是逆序排列的,将出现最坏情况。
如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的次数,即二分查找插入排序。
from random import shuffle
nums = list(range(10))
shuffle(nums)
# 将第一个元素作为有序序列
for i in range(1, len(nums)):
# 遍历有序序列,每处理一趟固定一个元素
for j in range(i, 0, -1):
# 当元素小于有序序列的最大值时,依次左移,将元素插入合适位置
if nums[j] < nums[j-1]:
nums[j-1], nums[j] = nums[j], nums[j-1]
# 如果元素大于等于有序序列最大值,则不动
else:
break
print(nums)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
参考:
https://zh.wikipedia.org/wiki/插入排序
http://www.cnblogs.com/fanyong/archive/2012/03/23/2413553.html