常用算法之插入排序
原文链接:http://blog.csdn.net/kimylrong/article/details/17121519
http://www.imooc.com/article/1273?from=itblog
感谢分享
排序算法是最简单的算法,也是最基本的算法。顾名思义,插入排序就是把当前待排序的元素插入到一个已经排好序的列表里面。 一个非常形象的例子就是右手抓取一张扑克牌,并把它插入左手拿着的排好序的扑克里面。插入排序的最坏运行时间是O(n2), 所以并不是最优的排序算法。特点是简单,不需要额外的存储空间,在元素少的时候工作得好。(基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。)
原理:
插入排序也是一种比较直观的排序方式。可以以我们平常打扑克牌为例来说明,假设我们那在手上的牌都是排好序的,那么插入排序可以理解为我们每一次将摸到的牌,和手中的牌从左到右依次进行对比,如果找到合适的位置则直接插入。具体的步骤为:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素小于前面的元素(已排序),则依次与前面元素进行比较如果小于则交换,直到找到大于该元素的就则停止;
- 如果该元素大于前面的元素(已排序),则重复步骤2
- 重复步骤2~4 直到所有元素都排好序 。
下面是插入排序的动画演示:
作者: i爱慕客
链接:http://www.imooc.com/article/1273?from=itblog
来源:慕课网
Java里面有很多数据类型,我们选取的是最简单的整数,但这并不失一般性。即使是自己定制化的对象,实现了java.lang.Comparable, 把对应的 大于号(>)以及小于号(<)换成compareTo即可。
由于需要频繁的操作以及打印数组,先写一个小的数组工具类。代码如下:
从数组的第二个元素开始,取得当前待处理的元素,插入到当前元素之前的子数组里面,直到数组的末尾。插入排序的Java实现以及测试代码如下:
结果如下:
另一种写法:
时间复杂度:O(n^2).