说到插入排序,先引用维基百科上的一段话,来对其描述:
插入排序(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语言算法实现:
//对无序数组进行插入排序操作.
public static void sort(int[] arr){
//循环次数与数组长度相同,每循环一次,进行一次插入操作.
for(int i=1;i
=0 && arr[j]>temp){
arr[j+1] = arr[j];
j--;
}
//将temp值插入合适的位置
arr[j+1] = temp;
}
}
接着再引用维基百科上的一段话,对插入排序算法的时间复杂度进行说明:
如果目标是把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
/*
1.本文为原创技术文章,首发CSDN个人站点(http://blog.csdn.net/u011429947)。
2.所做文章仅用于相互学习和交流,转载请注明作者及出处。
3.由于个人能力有限,错误之处在所难免,如能指出,非常感谢。
*/