插入排序
插入排序原理
Java代码
- 总结
插入排序原理
如图1:
插入排序的原理相当简单,就好像摸一副牌,每次都要将摸到的一张牌,插入到已经排序好的牌中,比如下一次摸到10
1.首先将10与A比较,A比10大,所以A向后移动一个位置
2.这时就可以把10插入到原来A的位置吗?答案是:不能
3.此时还需要比较K与10的大小,Q与10的大小
4.直到J,发现J还是比10大,所以J向后移动一个位置
5.此时后面已经没有可以比较的牌了,所以将10放置在J后即可,如图2所示
Java代码
package cn.com.mp.sort;
public class InsertionSort {
public static void main(String[] args) {
//int[] array = { 2, 3, 5, 6, 7, 9, 45, 56, 90 };
int[] array={56,2,8,5,9,46,53,7,1};
sort(array);
}
/*
* 定义插入排序算法,以从小到大的顺序排序
* */
public static void sort(int[] array){
int len=array.length;
/*
* 假设此数组为一副牌
* 1.默认第一张牌我们已经拿在手里,所以i=1开始
* 2.依次将所有的牌拿到手里
* */
int temp,j;
for(int i=1;i<len;i++){
temp=array[i];//将刚刚拿到手里的牌,放在临时变量中
/*
* 1.从最后的位置开始循环遍历,已经拿在手里的i-1张牌,所以j=i-1开始
* 2.循环结束的条件,j>=0 && array[j]>temp,即遍历完所有手里的牌或者temp>=手里的某张牌
* 3.因为判断条件是严格>,=的时候并不移动位置,所以保证了稳定性
* */
for(j=i-1;j>=0 && array[j]>temp;j--){
/*
* 若循环没有结束即手里还有牌,并且当前位置的牌比temp大
* 则将这张牌后移一个位置,腾出空位
* */
array[j+1]=array[j];
}
/*
* 判断循环跳出,则为空位赋值,将temp放在空位上
* 因为循环结束时,j--,所以空位应该在j+1的位置上
* */
array[j+1]=temp;
}
/*所有的牌拿到手后,代表插入排序已经完成,即可遍历输出*/
for(int i=0;i<len;i++){
System.out.print(array[i]+" ");
}
}
}
运行结果:
总结:
1.时间复杂度:
最好情况,每一次摸到的牌都比手中排序好的最后一张牌大,所以不需要移动位置,只需将n张牌拿手即可,所以时间复杂度为O(n)
最坏情况,每一次摸到的牌都比手中已排序好的任何一张牌小,所以需要移动手中所有的牌的位置,所以时间复杂度为O(n^2)
2.稳定性
因为定一个严格的判断,只有当array[j]>temp时才将j位置的牌后移一个位置,等于时并不移动,所以插入排序是稳定性排序
3.建议
建议建立断点,使用Junit跟踪调试当数组已经是排序好的情况,可更加清楚的判断时间复杂度