//这里为了方便理解,先简单推导了排序的前3轮,之后再总结出最终的排序算法
//插入排序算法基本思想:
//把n个待排序的元素看成一个有序表一个无序表,开始的时候有序表只包含一个元素,无序表包含n - 1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将他插入到有序表的合适位置
import java.util.Arrays;
public class InsertSort{
public static void main(String[] args){
int[] arr = {1, 213, 123, 12, 12, 32231, 241};
insertSort(arr);
System.out.println("排序后:" + Arrays.toString(arr));
}
public static void insertSort(int[] arr)
{
//第一轮
//定义插入数
//第一轮待插入下标为0
//插入数为数组第二个元素arr[1];
int insertVal = arr[1];
int insertIndex = 0;
//下面进行while循环判断
while(insertIndex >= 0, arr[insertIndex] > insertVal){
//将待插入数的下标对应元素往后移一个
arr[insertIndex + 1] = arr[insertIndex];
//待插入下标往前移一位
insertIndex--;
}
//退出while循环的时候
//有两种情况
//1.insertIndex = -1,表明在有序表中没有找到比插入数值小的值,那么就将插入数,插在有序表的第一个位置
//arr[-1 + 1] = insertVal;
//也就是arr[insertIndex + 1];
//2.insertIndex >= 0 && arr[insertIndex] < insertVal
//此时应该将insertVal插入到arr[insertIndex + 1]的位置
arr[insertIndex + 1] = insertVal;
//第二轮
insertVal = arr[2];
insertIndex = 1;
while(insertIndex >= 0, arr[insertIndex] > insertVal){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex + 1] = insertVal;
//第三轮
insertVal = arr[3];
insertIndex = 2;
while(insertIndex >= 0, arr[insertIndex] > insertVal){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex + 1] = insertVal;
}
//依次类推
//整理出插入排序算法
for(int i = 1; i < arr.length; i++){
int insertIndex = i - 1;
int insertVal = arr[i];
while(insertIndex >= 0, arr[insertIndex] > insertVal){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex + 1] = insertVal;
}
}