package com.hejiale.arithmetic.sort.bubble;
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr = {3, 9, -1, 10, 20, 13, 2, 6, 23, -2, -5, 21,-21};
/*
直接插入排序思路:
直接插入排序的核心
1. 就是将数组分为了两部分,有序部分和无序部分,然后我们每次从无序部分中,选择一个
元素
2. 紧接着遍历有序部分,找到合适的插入位置
3. 将插入位置以及之后的元素全部后移,空出一个位置用来放待插入元素,
或者另一种思路,我们遍历的过程中,没遍历一次,如果没有找到待插入位置,就将该元素后移
代码实现:
1. 首先,准备两个辅助变量
1. insertIndex 用来保存假定插入位置
2. insertVal 用来保存待插入元素,因为在之后的遍历过程中,回发生元素的移动,可能回将arr[i]覆盖
所以我们提前用insertVal保存待插入元素
3. for循环,该循环每次操作的对象就是待插入元素
之后,倒着遍历有序部分,没遍历一次,如果没有获得最终插入位置,就后移一次,直到找到最终插入位置为止
*/
insertSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void insertSort(int[] arr){
int insertIndex = 0;
int insertVal = 0;
//我们将数组分为有序部分和无序部分,有序部分初始值长度为1,所以我们应该从下标为1的元素开始遍历
for (int i = 1; i < arr.length; i++) {
/*
注意,我们这里并没有设置insertIndex为0,而是i-1,因为我们是倒着遍历有序部分
*/
insertIndex = i - 1;
/*
待插入元素位arr[i],因为在后面的移动元素的过程中,arr[i]很有可能被覆盖,所以要提前保存好inserVal的值
*/
insertVal = arr[i];
/*
1. insertIndex >= 0 防止发生越界异常
2. arr[insertIndex] > insertVal 是用来定位插入位置,因为有序部分由小到大,所以如果假定插入位的元素
大于待插入元素,就说明还没有找到插入位置,所以应该将待插入位置的元素后移一位,然后insertIndex递减
直到
1. insertIndex <0 说明待插入元素是最小值,应该将待插入元素放到数组的第一个,也就是有序部分的
全部元素都要后移
2. arr[insertIndex] <= insertVal 说明insertIndex就是最终的插入位置
*/
while (insertIndex >= 0 && arr[insertIndex] > insertVal){
arr[insertIndex+1] = arr[insertIndex];
insertIndex--;
}
/*
while循环遍历完,就可以找到插入位置:insertIndex+1,接下来赋值即可
*/
arr[insertIndex + 1] = insertVal;
}
}
}
6.3-直接插入排序
最新推荐文章于 2023-06-25 14:27:01 发布