插入排序
1.插入排序整体思想
最开始将数组分为两部分,左边是数组的第一个数,右边是待排序的部分。
左边排好序的数组和右边没排好序的第一个数组值比较,如果值比排好序的小就记住需要覆盖的下标并将小的这个值临时保存起来,然后将之前排好序的数组依次按照最小下标位置往后移动一次顺序,然后将临时保存的最小数据放在覆盖的位置
2.插入排序用图形演示
3.代码如下:
package sort;
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr = new int[]{12,3,-7,6,-1};
InsertSort.test(arr);
}
//插入排序
//每轮操作完成核心目标:
//1.拿到右边当前要操作的数据,这个值需要临时的保存起来,以便向左边插入合适的位置
//2.找出左边一个合适的插入位置
//3.最后把右边当前操作的数据,插入到左边合适的位置
//4.注意,最后一个数字也需要进行比较,因为要插入到左边一个合适的位置
public static void test(int[] arr){
//输出排序前的数组的排列
System.out.println("排序前数组为:" + Arrays.toString(arr));
//当前在右边拿到的第一个要进行操作的数据
int currentValue;
//需要把数据在左边插入的位置
int insertPosition;
//外层循环,控制比较的轮数
//同时,变量i的值,还是每一轮我们要操作的右边的第一个数字的下标
for(int i = 1;i < arr.length;i++){
//提前保存好我们当前要操作的值
currentValue = arr[i];
//假设当前变量i的值就是要插入的位置,因为这个数据有可能是原位置不动的
insertPosition = i;
//内层循环,控制每轮比较的次数,以及比较的顺序
//同时,变量j的值,还是左边数据中从大到小的下标值
for(int j = i - 1;j >= 0;j--){
//每次比较,如果发现arr[j]比当前要操作的数字大
if(arr[j] > currentValue) {
//就把这个大的数字往后移动一个位置,就是往后赋值
arr[j + 1] = arr[j];
//然后记录一下这个位置,因为这个位置很可能是要插入的位置,到底是不是这个位置,
//需要和下一个数字比较后才知道
insertPosition = j;
}else{
//如果发现一个比currentValue值还小的值,那么这个值得上一个比较的位置就是我们
// 要找的插入的位置,结束当前循环
break;
}
}
//内层循环结束后,把当前要操作的值currentValue,插入到指定位置insertPosition
//如果insertPosition和当前i值相等,说明当前操作的这个值currentValue是不需要移动的
if(insertPosition != i){
//进行值的插入
//把当前右边第一个值(正在操作的值),插入到左边合适的位置
arr[insertPosition] = currentValue;
}
//输出每一轮排序的过程
System.out.println("第"+ i + "趟排序:" + Arrays.toString(arr));
}
//最后输出排序的结果
System.out.println("排序后数组为:" + Arrays.toString(arr));
}
}
4.运行结果
排序前数组为:[12, 3, -7, 6, -1]
第1趟排序:[3, 12, -7, 6, -1]
第2趟排序:[-7, 3, 12, 6, -1]
第3趟排序:[-7, 3, 6, 12, -1]
第4趟排序:[-7, -1, 3, 6, 12]
排序后数组为:[-7, -1, 3, 6, 12]