http://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F
插入排序:Insertion Sort:稳定
1,从第一个元素开始,该元素默认被排序;
2,取出下一个元素(新元素key),然后在已经排序的元素序列中从后向前扫描;
3,如果已排序的序列中的元素大于新元素,将该元素移向下一位置;
4,重复步骤3,直到找到小于新元素的该元素(data[position-1]);
5,将新元素插入到该元素后面
6,重复2~5。
1 public class Insertion 2 { 3 public static void insertionSort(Comparable data[]){ 4 for(int index = 1; index < data.length; index++) 5 { 6 //要被排序的新元素key 7 Comparable key = data[index]; 8 //新元素初始位置 9 int position = index; 10 while(position > 0 && data[position-1].compareTo(key)>0){ 11 //将旧元素后移一位 12 data[position] = data[position-1]; 13 //继续往前寻找符合条件(小于新元素key)的旧元素,直到序列的起点0 14 position--; 15 } 16 //将新元素key放在符合条件的元素的后面,即position处。 17 data[position] = key; 18 } 19 } 20 public static void main(String[] args) 21 { 22 Comparable []c = {12,33,2,55,34,877,6,77}; 23 insertionSort(c); 24 System.out.print("插入排序后:"); 25 for(Comparable comparable: c) 26 { 27 System.out.print(comparable+" "); 28 } 29 } 30 31 }
如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数减去(n-1)次。平均来说插入排序算法复杂度为O(n2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。 插入排序在工业级库中也有着广泛的应用,在STL的sort算法和stdlib的qsort算法中,都将插入排序作为快速排序的补充,用于少量元素的排序(通常为8个或以下)。
原文:http://www.cnblogs.com/wangziqiang/p/3596493.html