插入排序(扫盲)

来源:互联网 发布:淘宝好评评语怎么删除 编辑:程序博客网 时间:2024/05/17 09:29

说到插入排序,先引用维基百科上的一段话,来对其描述:

插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。        ——quote from wikipedia (http://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F)

对插入排序有了一个基本的了解后,下面以升序排列无序数组 {3,5,1,4,6,8} 为例,对插入排序的具体步骤进行说明。

具体步骤:

1.将无序数组按“有序”和“无序”分成前后两个部分。

有序:{}       无序:{3,5,1,4,6,8}

2.将数组的无序部分的第一个数,升序插入到数组有序部分的合适位置(所谓的“插入”,是要伴随着数组中数据的互换操作)。

插入后:有序:{3}       无序:{5,1,4,6,8}

3.循环第二步,直到数组全部有序。

将数组的无序部分的第一个数( 5 ) ,升序插入到数组有序部分的合适位置 (3 的后面):

插入后:有序:{3,5}        无序:{1,4,6,8}

将数组的无序部分的第一个数 ( 1 ),升序插入到数组有序部分的合适位置 (3 的前面):

插入后:有序:{1,3,5}        无序:{4,6,8}

将数组的无序部分的第一个数 ( 4 ),升序插入到数组有序部分的合适位置 (3 和 5 之间):

插入后:有序:{1,3,4,5}        无序:{6,8}

将数组的无序部分的第一个数 ( 6 ),升序插入到数组有序部分的合适位置 (5 的后面):

插入后:有序:{1,3,4,5,6}        无序:{8}

将数组的无序部分的第一个数 ( 8 ),升序插入到数组有序部分的合适位置 (6 的后面):

插入后:有序:{1,3,4,5,6,8}        无序:{}

Java语言算法实现



个人完整代码请参见github:https://github.com/WangHuaJie/algrethoms/blob/master/insertionSort.java

接着引用维基百科上的一段话,对插入排序算法的时间复杂度进行说明:

如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数减去(n-1)次。平均来说插入排序算法复杂度为O(n2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。 插入排序在工业级库中也有着广泛的应用,在STL的sort算法和stdlib的qsort算法中,都将插入排序作为快速排序的补充,用于少量元素的排序(通常为8个或以下)。         ——quote from wikipedia (http://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F


reference:

1.《Algorithms》(中文版)Robert Sedgewick , Kevin Wayne 著,谢路云 译        P157~P159

2.百度百科:http://baike.baidu.com/view/396887.htm

3.维基百科:http://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F



0 0