2-2 插入排序(2)
来源:互联网 发布:淘宝企业店铺需要什么 编辑:程序博客网 时间:2024/06/12 20:31
问题来源
在我们 “第 1 版”插入排序的版本中,内层循环多次交换元素这个过程其实是可以优化的。
代码实现
下面我们给出两种一模一样的针对插入排序的优化方案,供大家仔细比对:
须要说明的地方:
1、与原来的插入排序比,少了一系列交换元素的位置的操作,而是使用了一个临时变量先把这个元素存起来,然后依次与它前面元素比较,如果前面的元素大,就将前面的元素后移,然后再将这个临时存储起来的元素与再一个前面的元素比较,如果再一个前面的元素等于这个临时存储起来的元素,或者比这个临时存储起来的元素小,那么之前被存储起来的元素就应该放在这个位置。
如此一来,一系列“多次交换”的就变成了“先存储变量,然后移动元素,最后把之前存的临时变量赋值的操作。
简而言之,我们使用了一个临时变量,将之前“多次交换变量”的过程转变为“多次赋值”的过程。
这个过程一开始可能会觉得比较抽象,多写几遍就会发现,其实是一个非常简单的算法实现。
写法1:
图:插入排序优化版的另一种写法,其实这种写法更加直接
思路其实很简单:就是多用了一个元素的位置,保存一下,然后一个一个后移。直到找到了元素合适的位置,就把临时存起来的变量放在这个位置。
写法2:
图:先把这个元素存起来,然后后面的元素依次与这个存起来的元素进行比较
上面的两张图的代码是等价的,如果不是很好理解的话,可以复习一下, for 循环的执行流程。
图:for 循环的执行流程图
总结
- 我们应该把握这种优化的思路:先把这个元素缓存起来,挨个与这个元素前面的元素比较,如果前面的元素大的话,前面的元素后移,此时留出了一个空位,继续,再比较前面的前面的元素,如果前面的前面的元素小于等于这个缓存的元素,缓存的元素就应该放在刚刚那个空位上,内层循环结束。
- 理解上面两种写法等价之处,这种细节的地方希望多体会一下,重点在于对 for 循环的执行流程的理解。
阅读全文
0 0
- 插入排序(2)
- 插入排序(直接插入排序,折半插入排序,2路插入排序)
- 排序 : 2 插入排序
- 排序 : 2 插入排序
- 排序2-插入排序
- 排序2:插入排序(折半插入排序)
- 排序3:插入排序(2路插入排序)
- 算法学习之排序算法:插入排序(直接插入排序、折半插入排序、2-路插入排序)
- 插入排序--2路插入排序
- 插入排序之2路插入排序
- (2)直接插入排序
- 经典排序算法2(插入排序)
- 排序(2)直接插入排序
- 排序算法(2)-直接插入排序
- java排序(2):插入类排序
- 算法排序(2):插入排序
- 插入排序(直接插入排序,折半插入排序,2路插入排序,希尔排序)
- 插入排序(直接插入排序,折半插入排序,2路插入排序,希尔排序)
- 考研英语
- 第1章 当我们谈论算法的时候,我们在谈论什么?
- 第2章 排序基础
- 2-1 选择排序
- 2-2 插入排序(1)
- 2-2 插入排序(2)
- 每日英语阅读(五十六)
- 2-2 插入排序(3)
- Python 函数式编程(一)
- 2-3 冒泡排序
- 让你越来越值钱的秘密:目标清单
- NOIP模拟9.13
- Virus_JS3_PyAnalysisAndSummary
- [树形dp][trie]cf856B Similar Words