插入排序算法的思路其实和玩扑克牌一样,当我拿到一副牌后,我都会下意识地把小的牌抽出来,插到左边的一侧去,把大的牌抽出来,再插到右边的一侧去,反复操作几次,一副牌的顺序就被排好了,而插入算法的原理也是如此。
比如你拿到这样“一副牌”:[4,3,1,5,7,6,2],我们现在使用插入排序的思路对这副“牌”进行从小到大的排序。
我们现在来模拟抓牌的过程:
第一次拿到的牌是4,现在把它握到手里不动,
第二次拿到的牌是3,比4小,所以把它放到4前面,手里的牌是[3,4,1,5,7,6,2],
第三次拿到的牌是1,比3和4都小,所以放在最前面,手里的牌是[1,3,4,5,7,6,2],
第四次拿到的牌是5,比1,3,4大,所以原地不动,手里的牌是[1,3,4,5,7,6,2],
第五次拿到的牌是7,比1,3,4,5都大,所以原地不动,手里的牌是[1,3,4,5,7,6,2],
第六次拿到的牌是6,比7小,比5大,所以放在5,7之间,手里的牌是[1,3,4,5,6,7,2],
第七次拿到的牌是2,比3小,比1大,所以放在1,3之间,手里的牌是[1,2,3,4,5,6,7],
(有人喜欢用动画的方式演示,各种柱形图飞来飞去的,我看得眼花,我更喜欢用语言和数列展示,这样更容易发现规律)
现在开始代码实现(Python):
a=[4,3,1,5,7,6,2] for i in range(1, len(a)): value = a[i] j = i - 1 while value < a[j] and j >= 0: # 如果a[i]比a[j]小,则将a[j]元素依次往右面的a[j+1]复制,这样会把a[i]的值覆盖掉 a[j + 1] = a[j] j -= 1 # 全部复制完,但a[i]被覆盖了,好在我们最开始用value保存了a[i],所以最后将a[i]放到最前面的位置 a[j + 1] = value print(a)
选择排序与插入排序的区别:
选择排序的时间复杂度是稳定的O(
)
插入排序的时间复杂度最差的情况是O(
),如果数组本身有序,其时间复杂度为O(n)。
这也是插入排序的在某些情况下的优势。
总结:在数组中大部分元素都有序的业务场景,适合使用插入排序。