直接插入排序是一种最简单的插入排序。(O(N2))
/*3,1,5,4,2
第一次排序,1比3小,则1和3换位置,变为了1,3,5,4,2
第二次排序,5比3大,不需要调整,仍未1,3,5,4,2
第三次排序,4比5小,则4和5 换位置,此时4比3大,则不再继续调整,此时变为了1,3,4,5,2
第四次排序,2比5小,2和5换位置,2又比4小,2继续和4换位置,2仍然比3小,继续和3换位置,最后2比1大
,不再调整。最终,变成了1,2,3,4,5.
数据变成了有序。*/
1 直接插入排序的过程中,不需要改变相等数值元素的位置,所以它是稳定的算法。
2 当数据正序时,执行效率最好,每次插入都不用移动前面的元素,时间复杂度为O(N)。
当数据反序时,执行效率最差,每次插入都要前面的元素后移,时间复杂度为O(N2)。
所以,数据越接近正序,直接插入排序的算法性能越好。
区别
1 冒泡时在 [未排序的部分] 里面找最大(或小),放到一端。插入是往 [已排序好] 的部分里面插入当前数。
2 不变条件(invarient)不同:冒泡是,最大的数会先被排序好到一端。插入是当前点的一侧是已排序的( sorted ),
这些数并不一定是最大的或者最小的。
3 循环终止条件不同:冒泡必须遍历未排序的所有数字才能找到最大,插入找到合适位置就可以停。
4 插入排序越往后面,动静越大(两两比较(第二个会和前(前移动继续向前移动)后比较,),找一个合适的位置,)
因为涉及到的元素越来越多;
5 冒泡排序越往后面(一轮两两排序找到最大或者最小固定位置,再继续剩下两个元素两两排序),
动静越小,因为涉及到的元素越来越少。
public class InsertSort {
public static void main(String[] args) {
int[] sort ={3,1,5,4,2} ;
System.out.println("排序前:");
print(sort);
insertSort(sort);
System.out.println("\n排序后:");
print(sort);
}
public static void insertSort(int[]a){
for (int i=1;i<a.length;i++){
int j;
int tmp=a[i];
for (j=i-1;j>=0&&a[j]>tmp;j--){
a[j+1]=a[j];
}
a[j+1]=tmp;
}
}
public static void print(int[]a){
for (int i=0;i<a.length-1;i++){
System.out.println(a[i]+" ");
}
}
}