老规矩,直接上代码,注释比代码多
/**
* @author liqiming
* @date 2021-5-12 -17:57
* 插入排序:
* 1.插入排序的精髓是先数组的第一数据默认为已经排好序
* 2.后面的数据和前面排好序的比较,碰见比该数据大的就放在该数据后面
* 3.插入排序带来的问题是,插入的时候,需要把插入后面的数据都往后移动一位
* 如,5号元素需要往2号元素后面插入,那么34元素需要往后移动一位
* 我们需要记录一下插入位置和,插入元素的原来位置,中间的需要移动
* 在移动的时候肯定从最后一位开始移动
*/
public class insertSort {
public static void main(String[] args) {
//如果数组有5个数据,那么需要比较4次
//定义外层循环
int[] arry = {23, 32, 1000, 40, 99,12345,1234567,1};
for (int i = 1; i < arry.length; i++) {//外层length-1 次循环
//定义一个数据,记录一下从哪开始接着根拍好序的数据比较
//定义一个变量保存a[i]
int muddle = arry[i];
int j = i - 1;
for (; j >= 0 && arry[j] > muddle/* 这里我用的是muddle ,muddle是arry[i]传过来的,但是这里换成arry[i]就会出错。怎么回事 */; j--) {//这里的j >= 0 && arry[j] > muddle 顺序不可变,知道为什么么?
arry[j + 1] = arry[j];
}
arry[j + 1] = muddle;
}
for (int i = 0; i < arry.length; i++) {
System.out.println(arry[i]);
}
}
}
2.看过代码的可能也不明白,为什么第二个for循环里面注释的东西这样呢,想不懂?
解答:我们不用muddle 用了 arry[i] 在后面的代码里面被更新了,置换了。再去判断的时候就出错了,建议以后在修改一些东西的时候,给与一个变量之类的,传参,以免后面的修改影响了前面的代码
3.还有一处就是j >= 0 && arry[j] > muddle 顺序不可变
解答:判断的时候最后一个循环j=-1.数值越界了,但是j >= 0 放在前面,代码执行的时候,首先这个
条件就不成立,既然是一个与的关系,后面的就不判断了,就不会报错,