假定:有 1 个乱序的数列 nums ,其中有 n 个数。
要求:排好序之后是 从小到大 的顺序。
插入排序算法
代码
def insert_sort(nums):
i = 1
n = len(nums)
while i <= n-1:
j = i
itemToInsert = nums[i]
while j >= 1 and itemToInsert < nums[j-1]:
nums[j] = nums[j-1]
j -= 1
nums[j] = itemToInsert
i += 1
我的理解
就像玩扑克牌时,摸牌、插入牌一样。
假定原本就有 1 张牌 nums[0] 在手里。
摸的下 1 张牌是 nums[i],即 itemToInsert 待插入的牌。
j = i ,则 j-1 等于 i-1 ,nums[j-1] 即 待插入的牌的前一张牌。
如果 itemToInsert 总比 前一张牌 小,
则 将 前 1 张牌 往后挪 1 个位置,即 nums[j] = nums[j-1]。
然后 j 自减,不断地将 itemToInsert 与 前面的 牌 比较大小,
直到 itemToInsert >= nums[j-1] 。
(说明前 1 轮循环成立,本轮循环不成立。)
这时候,说明有 nums[j-1] <= itemToInsert < nums[j] 。
那么,itemToInsert 应该插入的位置是 nums[j] 。
原理
将待排序的一组序列分为已排好序的和未排序的两个部分:初始状态时,已排序序列仅包含第 1 个元素,未排序序列中的元素为除去第 1 个以外 N-1 个元素;此后将未排序序列中的元素逐一插入到已排序的序列中。
算法复杂度
时间复杂度:
最坏情况下 O(n^2) ;
最好情况下 ;
平均情况 。
空间复杂度:
O(1)。
稳定性
该算法在遇到相同大小的元素时,则不移动相同大小的元素,因此是稳定的。
参考文献
- 《数据结构与算法 Python 语言描述》 - 裘宗燕 - 北京大学 - 9.2.1 插入排序 - P323——P325;
- 《数据结构(第 2 版)》 - 浙江大学 - 7.3.1 简单插入排序 - P268,P269;
- 《数据结构 Python 语言描述》 - Lambert - 3.4.3 插入排序 - P50——P53;
- https://github.com/henry199101/sort/blob/master/insert_sort.py。