将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
插入排序的本质:1、第一个数本身有序,i从第二个数开始
2、先循环遍历数组
然后比较array[j] 和tmp的大小
如果array[j] > tmp,
array[j+1] = array[j]
反之将tmp给到array[j+1]
public static void insertSort(int[] array){
for (int i = 1; i < array.length; i++) {
int tmp = array[i];
int j=i-1;//保证拿到的都是i-1下标的数
for (; j < array.length; j--) {
if(j > 0 && array[j] >= tmp){
//防止j<0越位
array[j+1] = array[j];
}else {
break;
}
}
array[j+1] =tmp;
}
}
特性:
时间复杂度:O(N^2),最坏情况
O(N),最好的情况,就是有序
空间复杂度:O(1)
稳定性:稳定,因为没有换位
if(j > 0 && array[j] >= tmp){
//防止j<0越位
array[j+1] = array[j];
如果不要等号,就是不稳定的
结论:
一个稳定的排序,可以实现为不稳定的 但是一个本身就不稳定的排序,是不可以变成稳定的排序