1 概述
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。通俗讲就是,好比打斗地主时抓扑克牌一样,每次抓起一张牌就找到其合适的位置放进去。
2 算法流程
- 每次循环需要加入一个未排序的元素key,从后往前扫描,如果比key大的数就将其后移位置,给key腾位置,扫描到初始位置或找到不大于key的元素,实际上就是给key找合适的位置放进去
- 第1个元素不用找位置,从第2个元素开始按照步骤1找位置,依次进行,直至完成最后1个位置的找位置操作
3 代码/Python
def InsertionSort(nums):
# 第一个元素不用动,遍历后面所有的元素
for i in range(1,len(nums)):
# 第i次循环需要加入1个元素,使得已排序的数列长度为i
# 记录加入的这个元素的数值
key = nums[i]
# 对前i-1个已排序的数列从后往前扫描,j是扫描位置
j = i - 1
# 由后向前,终止条件是到达初始位置或没有比key更大的数,由于前i个都是已排好序的,所以出现不大于key时,循环就终止了
while(j>=0 and nums[j]>key):
# 扫描过程中,如果找到比key更大的数,则位置后移(腾出1个位置给key)
nums[j+1] = nums[j]
j = j - 1
# 循环结束后的j是-1或者最先出现的不大于key的元素的位置,因此key排在j+1
nums[j+1] = key
return nums
# 算法调用
import random
nums = [random.randint(0,100) for i in range(10)]
print('随机生成10个数字:', nums)
print('排序后输出结果为:', InsertionSort(nums))
4 算法解释
- 插入排序,原理很好理解,算法实现有个细节就是记录key的值,然后从后往前扫描,将比key大的元素往后挪位置
- 时间复杂度:采用两层嵌套循环,所以时间复杂度是 O ( n 2 ) O(n^2) O(n2);最好的情况就是数列本身已排好序,每次找位置操作进行一次扫描即可,所以最好情况是 O ( n ) O(n) O(n);最坏情况就是每次扫描都需要遍历一遍已排序数列,找到起始位置,所以最坏情况是 O ( n 2 ) O(n^2) O(n2)
- 空间复杂度:由于开辟的额外空间只需记录每次循环新增的元素key,所以是 O ( 1 ) O(1) O(1)
- 稳定性:每次扫描遇到不大于key的数就停止,所以相等的元素的相对位置不会发生变化,所以是稳定的