思路:插入排序很像我们打扑克时候的整理牌!抓到一张新牌就把他放到合适的位置!
首先第一步,我们先把第一个元素看成已经排好序的序列,我们还是用具体序列来看
8,3,4,9,7 (直接将8看成有序的)
第一步,将8看成有序的,那么我们应当是从第二个数开始(也就是3开始),来找他合适的位置,3<8 那么3应该放到8的前面
3,8,4,9,7 (第一趟排好,那么3,8为有序序列,后面的为无序序列)
好的,接下来,我们从无序序列里抓到一张新牌——4,拿去和前面已经整理好的牌比较。4<8,那么再往前比较,4>3,所以4应当放在3,8之间
3,4,8,9,7 (第二趟)
循环操作 这次9比8还大,所以不用比较了
3,4,8,9,7 (第三趟)
最后一张牌再去比较,7应当在8,9之间
3,4,7,8,9 (第四趟)
由此可见,排序5个数,进行4趟,那么n个数,n-1趟(外层for循环)
代码实现思路:首先我们要进行n-1次排序 而且我们默认了第一个数为有序的,所以外层for循环从1开始(对应得数组就是第二个数)到最后一个数,然后将当前数和前面的数进行比较,首先要判断是不是比前面得数小,如果小,才要进行插入,如果大,那么就证明当前已经是有序序列。
代码实现
public class InsertSort {
public void insert(int[] t,int n) {
int min;
/*这里用1 因为第一个数,也就是t[0] 已经是有序的*/
for (int i = 1; i < n; i++) {
/*取当前这个数*/
min = t[i];
/*如果当前这个数 小于前面的那个数,才进行插入!
(因为前面是已经从小到大排好的序列,
如果当前数已经大于之前的最后一个数字。
那么就不用排了呀!)*/
if(t[i] < t[i-1]) {
/*那么就是将当前这个数,和之前一位开始的数字进行比较,
至于min为什么要小于之的数字t[j]是因为,如果出现了小于min的数,
那就证明找到min的位置了,
参考3,8 用4去插入 出现了3比4小,所以4应当放在3的后面
所以如果出现小于比较的数字,那么就不用比了
就可以停止循环,因为已经找到位置了*/
for (int j = i-1;j >= 0&&min < t[j];j--) {
/*
* 找到以后,将已经比较过的数字后移一位
* 因为我们最开始的那个要比较的数字已经保存到min中了,
* 所以不用担心覆盖的问题。
* 然后将要比较的数字放入到当前位置
* */
t[j+1] = t[j];
t[j] = min;
}
}
}
}
}
插入排序的动图(出自:1.3 插入排序 | 菜鸟教程)