2-2 插入排序(2)

来源:互联网 发布:淘宝企业店铺需要什么 编辑:程序博客网 时间:2024/06/12 20:31

问题来源

在我们 “第 1 版”插入排序的版本中,内层循环多次交换元素这个过程其实是可以优化的。

代码实现

下面我们给出两种一模一样的针对插入排序的优化方案,供大家仔细比对:

须要说明的地方:

1、与原来的插入排序比,少了一系列交换元素的位置的操作,而是使用了一个临时变量先把这个元素存起来,然后依次与它前面元素比较,如果前面的元素大,就将前面的元素后移,然后再将这个临时存储起来的元素与再一个前面的元素比较,如果再一个前面的元素等于这个临时存储起来的元素,或者比这个临时存储起来的元素小,那么之前被存储起来的元素就应该放在这个位置。

如此一来,一系列“多次交换”的就变成了“先存储变量,然后移动元素,最后把之前存的临时变量赋值的操作。

简而言之,我们使用了一个临时变量,将之前“多次交换变量”的过程转变为“多次赋值”的过程

这个过程一开始可能会觉得比较抽象,多写几遍就会发现,其实是一个非常简单的算法实现。

写法1:

图:插入排序优化版的另一种写法,其实这种写法更加直接

思路其实很简单:就是多用了一个元素的位置,保存一下,然后一个一个后移。直到找到了元素合适的位置,就把临时存起来的变量放在这个位置。

写法2:

图:先把这个元素存起来,然后后面的元素依次与这个存起来的元素进行比较

上面的两张图的代码是等价的,如果不是很好理解的话,可以复习一下, for 循环的执行流程。

图:for 循环的执行流程图

总结

  1. 我们应该把握这种优化的思路:先把这个元素缓存起来,挨个与这个元素前面的元素比较,如果前面的元素大的话,前面的元素后移,此时留出了一个空位,继续,再比较前面的前面的元素,如果前面的前面的元素小于等于这个缓存的元素,缓存的元素就应该放在刚刚那个空位上,内层循环结束。
  2. 理解上面两种写法等价之处,这种细节的地方希望多体会一下,重点在于对 for 循环的执行流程的理解。