图解部分:
代码部分:
package com.dl;
import java.util.Arrays;
public class InsertSortTest {
public static void main(String[] args) {
int[] array = {1,3,2,8,4,5};
insertSort(array);
}
/**
* 插入排序
* 思想:将数组的第一个元素看成有序的一个表,后面的元素堪称一个无序的。
* 然后,将后面的元素元素依次插入到前面
* 这里以从小到大排序为例子
* @param array
*/
public static void insertSort(int[] array) {
int insertValue = 0;
int beforeIndex = 0;
for(int i = 0;i<array.length-1;i++) {
//第一步:先保存待插入的数据
insertValue = array[i+1];
//第二步:保存待插入数据的前一个位置的索引。
beforeIndex = i;
//第三步:将待插入的数据,逐一和前面的数据进行大小的比较,然后找到其应该在的位置
//解释:beforeIndex >= 0 是为了防止数组下标越界
// insertValue < array[beforeIndex] 是为了判断待插入的数据和前面数据的大小
while(beforeIndex >= 0 && insertValue < array[beforeIndex]) {
//如果能够进入while循环,则表明,待插入数据小于前面的数据,则需要把前面的数据向后移动
array[beforeIndex+1] = array[beforeIndex];
//然后将索引自减,目的是为了拿待插入的数据,继续和前面的数据进行比较
beforeIndex--;
}
//第四步:while循环结束后,说明位置已经找到,则需要把待插入的数据插入到指定的位置
//当然这里可以判断一下是否需要赋值,注意:如果待插入数据的原先的位置就是需要插入的位置,则不需要赋值
if(beforeIndex+1 != i) {
array[beforeIndex+1] = insertValue;
}
//第五步:打印数组:
System.out.println("第"+(i+1)+"次排序:"+Arrays.toString(array));
}
}
}