排序算法之插入排序(关键词:数据结构/算法/排序算法/插入排序)

版权声明:本文为博主原创文章,可以转载,但转载前请联系博主。 https://blog.csdn.net/qq_33528613/article/details/83789898

假定:有 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)。

稳定性

该算法在遇到相同大小的元素时,则不移动相同大小的元素,因此是稳定的。

参考文献

  1. 《数据结构与算法 Python 语言描述》 - 裘宗燕 - 北京大学 - 9.2.1 插入排序 - P323——P325;
  2. 《数据结构(第 2 版)》 - 浙江大学 - 7.3.1 简单插入排序 - P268,P269;
  3. 《数据结构 Python 语言描述》 - Lambert - 3.4.3 插入排序 - P50——P53。

猜你喜欢

转载自blog.csdn.net/qq_33528613/article/details/83789898