插入排序是由排序的位置不断的向前比较,找到合适的位置,逐渐的对数据进行排序。
过程:
在插入排序中索引左边是有序的,但是位置并不确定,为了给更小的元素腾出空间,他们可能会进行移动,但是当前索引达到右端的时候就完成了排序。
时间:
插入排序所需的时间取决于输入的中元素的初始顺序。对于一个有序的数组或者接近有序的数组进行排序要比对一个乱序数组排序的时间短的多。
对于随机排列的长度为N且主键不重复的数组,平均情况下插入排序需要N²/4次比较以及N²/4次交换。最坏情况下需要N²/2次比较和N²/2次交换。最坏需要N-1次比较和0次交换。
代码:
元素交换
private static void exch(Comparable[] a, int j, int i) {
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
比较元素两个值
private static boolean less(Comparable a, Comparable j) {
return a.compareTo(j)<0;
}
上面两个方法可以看选择排序的介绍。
整个插入排序代码:
public static void sort(Comparable []a){
//1
int N=a.length;
//2
for (int i=1;i<N;i++){
//3
for (int j=i;i>0&&less(a[j],a[j-1]);j--){
//4
exch(a,j,j-1);
}
}
}
1.表示赋值,把数组的长度值赋值给N。
2.外层循环,循环次数。这里面i不是从0开始的而是从1开始的,因为在整个排序中第一个数值是不用排序的默认他是有序的。
3.内层循环,表示比较。j=i表示从第二个值开始向前比较,比较到了第一个值的时候就停止比较。less方法是比两个数的大小,如果后面的小于前面的就在下面进行交换。
4.表示交换的方法。