一、前言:插入排序法在现实中很像我们斗地主时对于手里的牌的排序,每次都将当前元素与其前面的元素进行比较,如果小于,则交换两元素的位置,直到元素最小。话不多说上代码。
二、算法实现
1、未优化前的插入排序 实现
public static <E extends Comparable<E>> void InsertSort(E[] array){
for (int i=1;i< array.length;i++){
//外层循环,从数组的第二个元素开始检索,第一个位置的元素固定不动。
for(int j=i;j>=1;j--){
if (array[j].compareTo(array[j-1])<0){
//若比前面的小,则将两元素位置互换。
E swap=array[j];
array[j]=array[j-1];
array[j-1]=swap;
}
}
}
System.out.println(Arrays.toString(array));
}
2、优化后的插入排序实现(将元素的交换变成了元素的平移,提高了算法的性能)
/**
* 优化插入排序法,使交换操作变成平移。直接赋值,无需交换
*/
public static <E extends Comparable<E>> void batterInsertSort(E[] array){
E bank;//使用变量暂存与其他元素比较的元素,即array[j]
for (int i=1;i<array.length;i++){
for (int j=i;j>=1;j--){
bank=array[j];
if (array[j].compareTo(array[j-1])<0){
array[j]=array[j-1];//平移
}
}
}
System.out.println(Arrays.toString(array));
}
三、浅谈插入排序算法的特性:对于一个有序的数组,插入排序的算法复杂度为O(n),否则才为O(n^2);而对于选择排序,复杂度永远为O(n^2)。