排序-直接插入法
假设数组A={a1,a2,a3,a4…an}
1.从数组开始位置出发,把a1视为只有一个数据的有序数组
2.从a2开始遍历这个数组,拿每一个数据和前面的数据比较,如果前面的数据比这个数据大,那么把前面的数据往后推一个位置并记录其下标,直到前面的数据比这个数小,那么上一个比这个数大的数的位置就是要插入的位置,从a2到an依次插入之后就实现了将数组正序排列,倒序正好相反。
代码:
//直接插入排序法
public class InsertionSort {
public int[] inserSort(int[] arr) {
// 当前在右边拿到的第一个要进行操作的数据
int right;
// 需要把数据在左边插入的位置
int insert;
// 外层循环,控制比较的轮数
// 同时,变量i的值,还是每一轮我们要操作的右边第一个数字的下标
for (int i = 1; i < arr.length; i++) {
// 提前保存好我们当前要操作的值
right = arr[i];
// 假设当前变量i的值就是要插入的位置,因为这个数据有可能是原位置不动的。
insert = i;
// 内层循环,控制每轮比较的次数,以及比较的顺序
// 同时,变量j的值,还是左边数据中从大到小的下标值
// 例如:1 2 4 8 9 | 5 3 这个时候
// 我们拿着数字5 要依次和左边的9 8 4 2 1 比较
// 9 8 4 2 1的下标顺序就是4 3 2 1 0 ,这就是j的值的变化规律
for (int j = i - 1; j >= 0; j--) {
// 每次比较,如果发现arr[j]比当前要操作的数字大
if (arr[j] > right) { //这是正序(从小到大),if(arr[j]<right)就是倒序(从大到小)
// 就把这个大的数字往后移动一个位置,就是往后赋值
arr[j + 1] = arr[j];
// 然后记录一下这个位置,因为这个位置很可能是要插入的位置,到底是不是这个位
// 置,需要和下一个数字比较后才知道
insert = j;
} else {
// 如果发现一个比right值还小的值,那么这个值的上一个比较的位置就是我
// 们要找的插入的位置,结束当前循环
break;
}
}
// 内层循环结束后,把当前要操作的值right,插入到指定位置insert
// 如果insert和当前i值相等,说明当前操作的这个值right是不需要移动
// 的。
if (insert != i) {
// 进行值的插入
// 把当前右边第一个值(正在操作的值),插入到左边合适的位置
arr[insert] = right;
}
}
return arr;
}
}