插入排序
插入排序:顾名思义就是将一个元素插入到一个有序的序列的合适位置。对于一个序列其第一个元素组成的子序列肯定是有序的,因为这个子序列只包含一个元素,遍历后边的元素,依次插入到前面有序的子序列的正确位置中。这个过程是通过不断交换位置来完成的。如有一个无序数组4,1,2需要按从小到大排列
第一步:将1插入到有序序列4的合适位置,发现需要交换,交换后为1,4。这时1,4已经有序了。
第二步:将2插入到1,4有序序列的合适位置,首先发现4,2需要交换位置,变为1,2,4。2再与前一个数进行比较发现无需交换位置,到此2已经插入到了合适的位置。
到此这个无需序列已经变成有序的了,数据量多一点也是按照这个思路排,理解起来很简单。
可以看出插入排序和选择排序(如果对插入排序还不太了解请点击这里)有所不同,插入排序所需要的时间取决于元素的初始顺序。例如,对一个很大且其中的元素已经有序或者大部分有序的数组进行排序的话会比对随机顺序的数组或逆序数组进行排序要快的多。插入排序对于实际应用中常见的某些类型的非随机数据是十分有效的
算法实现
实现代码如下:
public class Insertion {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer[] a = new Integer[]{1,4,6,2,0,3,2,7,8,1,9};
sort(a);
SortUtil.show(a);
}
public static void sort(Comparable[] a){
int size = a.length;
for (int i = 1; i < size; i++) {
for(int j = i;j>0&&SortUtil.less(a[j], a[j-1]);j--){
SortUtil.exch(a, j, j-1);
}
}
}
}
从上面的代码中可以看出实现起来很简单,插入排序对于部分有序的数组是十分高效的,也很适合小规模的数组。