算法实现:
public class Insert implements SuanFa {
private static Logger logger = Logger.getLogger(Insert.class);
@Override
//数列分为排列好的前段和未排列的后段
//把后段的数值一个个取出,放到前段的合适位置
//这里需要注意往前段某一位置插入一个数,插入位置的后面数据整体下标位置加1(数组后移)
public void suanFaRealise(int data[]) {
logger.info("Insert realise start.");
int dataSize = data.length;
//这里注意data是从data[0]开始的就好理解了。
for (int i = 1; i < dataSize; i++)
{
int j = i - 1;
int current = data[i];
logger.info("第" + i + "次排列, 排列前数组为: " + UtilTool.toString(data));
logger.info("需要插入的值为" + data[i]);
//此处要遍历已经排好的数列,需要把current往该数列哪里插入。
for (; j >= 0 && data[j] > current; j--)
{
//比如当前你i=3,则j就为2,当发现data[2]>current时,需要把data[2]往后移动,即把data[3] = data[2];
data[j + 1] = data[j];
//此时再遍历data[1], 如果data[1]>current时,把data[2] = data[1],(把data[1],往后移动一位)
//。。。。
}
//这里说明data[j] <= current, 把current放在j+1位置上,有人会怀疑j+1貌似就是current下标i,
//其实不然,在上个for循环里j是一直减的,减到data[j] <= current满足时为止。
data[j + 1] = current;
logger.info("第" + i + "次排列后排列数组为:" + UtilTool.toString(data));
}
}
}
测试类:
public class Test {
private static Logger logger = Logger.getLogger(Test.class);
public static void main(String args[])
{
int[] test = {6, 1, 22, 7, 9, 33, 98, 55, 23, 78, 48};
logger.info("suanfa test start.");
//SuanFa suanfa = SuanFaFactory.getMaoPao();
//SuanFa suanfa = SuanFaFactory.getKuaiSu();
SuanFa suanfa = SuanFaFactory.getInsert();
suanfa.suanFaRealise(test);
logger.debug(UtilTool.toString(test));
}
}
执行过程:
2020-04-13 13:59:58 [ main:0 ] - [ INFO ] suanfa test start.
2020-04-13 13:59:58 [ main:4 ] - [ INFO ] start Insert suanfa.
2020-04-13 13:59:58 [ main:5 ] - [ INFO ] Insert realise start.
2020-04-13 13:59:58 [ main:6 ] - [ INFO ] 第1次排列, 排列前数组为: [6, 1, 22, 7, 9, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:6 ] - [ INFO ] 需要插入的值为1
2020-04-13 13:59:58 [ main:6 ] - [ INFO ] 第1次排列后排列数组为:[1, 6, 22, 7, 9, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:8 ] - [ INFO ] 第2次排列, 排列前数组为: [1, 6, 22, 7, 9, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:8 ] - [ INFO ] 需要插入的值为22
2020-04-13 13:59:58 [ main:8 ] - [ INFO ] 第2次排列后排列数组为:[1, 6, 22, 7, 9, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:9 ] - [ INFO ] 第3次排列, 排列前数组为: [1, 6, 22, 7, 9, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:9 ] - [ INFO ] 需要插入的值为7
2020-04-13 13:59:58 [ main:9 ] - [ INFO ] 第3次排列后排列数组为:[1, 6, 7, 22, 9, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:9 ] - [ INFO ] 第4次排列, 排列前数组为: [1, 6, 7, 22, 9, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:9 ] - [ INFO ] 需要插入的值为9
2020-04-13 13:59:58 [ main:10 ] - [ INFO ] 第4次排列后排列数组为:[1, 6, 7, 9, 22, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:10 ] - [ INFO ] 第5次排列, 排列前数组为: [1, 6, 7, 9, 22, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:11 ] - [ INFO ] 需要插入的值为33
2020-04-13 13:59:58 [ main:11 ] - [ INFO ] 第5次排列后排列数组为:[1, 6, 7, 9, 22, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:11 ] - [ INFO ] 第6次排列, 排列前数组为: [1, 6, 7, 9, 22, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:11 ] - [ INFO ] 需要插入的值为98
2020-04-13 13:59:58 [ main:11 ] - [ INFO ] 第6次排列后排列数组为:[1, 6, 7, 9, 22, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:12 ] - [ INFO ] 第7次排列, 排列前数组为: [1, 6, 7, 9, 22, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:12 ] - [ INFO ] 需要插入的值为55
2020-04-13 13:59:58 [ main:12 ] - [ INFO ] 第7次排列后排列数组为:[1, 6, 7, 9, 22, 33, 55, 98, 23, 78, 48]
2020-04-13 13:59:58 [ main:12 ] - [ INFO ] 第8次排列, 排列前数组为: [1, 6, 7, 9, 22, 33, 55, 98, 23, 78, 48]
2020-04-13 13:59:58 [ main:12 ] - [ INFO ] 需要插入的值为23
2020-04-13 13:59:58 [ main:12 ] - [ INFO ] 第8次排列后排列数组为:[1, 6, 7, 9, 22, 23, 33, 55, 98, 78, 48]
2020-04-13 13:59:58 [ main:13 ] - [ INFO ] 第9次排列, 排列前数组为: [1, 6, 7, 9, 22, 23, 33, 55, 98, 78, 48]
2020-04-13 13:59:58 [ main:13 ] - [ INFO ] 需要插入的值为78
2020-04-13 13:59:58 [ main:13 ] - [ INFO ] 第9次排列后排列数组为:[1, 6, 7, 9, 22, 23, 33, 55, 78, 98, 48]
2020-04-13 13:59:58 [ main:13 ] - [ INFO ] 第10次排列, 排列前数组为: [1, 6, 7, 9, 22, 23, 33, 55, 78, 98, 48]
2020-04-13 13:59:58 [ main:13 ] - [ INFO ] 需要插入的值为48
2020-04-13 13:59:58 [ main:13 ] - [ INFO ] 第10次排列后排列数组为:[1, 6, 7, 9, 22, 23, 33, 48, 55, 78, 98]
2020-04-13 13:59:58 [ main:14 ] - [ DEBUG ] [1, 6, 7, 9, 22, 23, 33, 48, 55, 78, 98]