思想:
直接插入排序是最简单的排序思想,就是类似打扑克牌你摸到一张牌你总是喜欢将牌从大到小排序的方式整理牌。
我现在有这样一个序列的数据,想用直接插入排序将其变为有序的数据,那么我们从第二个元素开始判断,因为只有一个元素的时候他一定是有序的,将i放在第二个元素并且我们用tmp变量将i元素的值给存起来,j为i-1在i元素的前一个元素。
我们可以带着这个思想写代码
for(int i = 1;i<array.length;i++){
int tmp = array[i];
for(int j = i-1;j>=0;j--){
//从这里开始往前面判断
if(array[j]>tmp){
//如果前面一个数比后面一个大
array[j+1] = array[j];//这里我们不能写array[j+1] = array[i]因为我们的i是固定不动的在这一轮中。
}else{
break;
}
}
array[j+1] = tmp;将一开始保留的array[i]的值放进去
}
接着继续执行i++,到第三个元素。
最后一直执行到i>=array.length为止。
最终代码如下:
public void insertSort(int[] array) {
int n = array.length;
for (int i = 1; i < n; i++) {
int tmp = array[i];
int j = i - 1;
for (; j >= 0; j--) {
if (array[j] > tmp) {
array[j + 1] = array[j];
} else {
break;
}
}
array[j + 1] = tmp;
}
}
插入排序的时间复杂度:O(n^2)->数据逆序,O(n)->数据有序
空间复杂度O(1)
稳定性:稳定