把n个待排序的元素看成是一个有序表和一个无序表,开始时有序表只包含一个元素,无序表中包含一个元素,无序表中包含(n-1)个元素。排序过程中,每次从无序表中取出第一个元素,将其与有序表的元素依次比较,将其插入到有序表中的适当位置,使之成为新的有序表。
R[0] R[1] R[2] R[3] R[4] R[5]
初始状态: (17) 3 25 14 20 9
第一次插入:(3 17) 25 14 20 9
第二次插入:(3 17 25) 14 20 9
第三次插入:(3 14 17 25) 20 9
第四次插入:(3 9 14 17 25) 20
第五次插入:(3 9 14 17 20 25)
public static void insertSort(int[] arr)
{
int insertVal = 0;
int insertIndex = 0;
//for循环简化代码
for (int i = 1; i < arr.length; i++)
{
insertVal = arr[i];//定义插入的数
insertIndex = i-1;//与前面的数比较
//接下来给insertVal找到合适的插入位置
//insertIndex >= 0, 保证给insertVal找到插入位置不越界
//insertVal < arr[insertIndex],表明没有找到插入位置
//此时需要将arr[insertIndex]后移
while(insertIndex >= 0 && insertVal < arr[insertIndex])
{
arr[insertIndex+1] = arr[insertIndex];
insertIndex--;
}
//当推退出while循环时,表明找到了插入位置,insertIndex+1
//判断是否需要赋值
if (insertIndex+1 != i)
{
arr[insertIndex+1] = insertVal;
}
}
}