插入排序详解
思路分析
- 插入排序即 将要插入的数寻找合适的位置插入
- 将一个要插入的数组分成两部分,一个有序表和一个无序表,然后将无序表中的每一个数插入到有序表中
- 在插入过程中,先寻找要插入的位置,然后插入
- 刚开始有序表可以认为是数组的第一个元素,无序表可以认为是数组中剩下的元素,然后依次插入,有序表边长,无序表变短
- 寻找插入的位置,从右至左依次扫描有序表中的元素并和要插入的元素作比较,如果要插入的元素较小,则右移当前有序表中的当前元素,直到要插入到元素大于当前有序表中的元素为止
- 找到位置后插入即可
- 源码及分析见下
源码及分析
/**
* 插入排序
* @param arr 要进行排序的数组
*/
public static void insertSort(int[] arr){
for (int i = 1; i < arr.length; i++) {
//定义变量insertValue保存要插入的值
int insertValue = arr[i];
//定义变量insertIndex保存要插入的数的位置索引
int insertIndex = i - 1;
//使用while循环寻找要插入的位置
//insertIndex >= 0 保证数组不越界
//如果要插入的数小于左边的数,则将左边的数向右移动,直到不小于为止,也就找到了待插入的位置
while (insertIndex >= 0 && insertValue < arr[insertIndex]){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex --;
}
//循环结束后则找到要插入的位置
//判断要插入的元素位置是否发生变化
if (insertIndex + 1 != i) {
arr[insertIndex + 1] = insertValue;
}
}
}