基本思路
当读入一个数据时,在已经排好的序列中,搜寻它正确的位置,插入读入的数据
注意:在插入之前,要先把它后面的所有数据后移一位,以防止要插入位置的原数据被覆盖
排序过程
初始数组:【4,3,6,1,8,5,2,7】
第一步: 4 【3,6,1,8,5,2,7】
第二步: 3,4 【6,1,8,5,2,7】
第三步: 3,4,6 【1,8,5,2,7】
第四步: 1,3,4,6 【8,5,2,7】
第五步: 1,3,4,6,8 【5,2,7】
第六步: 1,3,4,5,6,8 【2,7】
第七步: 1,2,3,4,5,6,8 【7】
第八步: 1,2,3,4,5,6,7,8
排序结果:1,2,3,4,5,6,7,8
动图演示
在已排序队列中,从后往前找
代码实现
public static void insertionSort(int[] arr) {
int temp = 0, n = arr.length;
int i = 0, j = 0, k = 0;
for (i = 0; i < n; i++) {
// 寻找已排序队列中比 a[i] 小的数,以便插入其后
for (j = i - 1; j >= 0 ; j--) {
if (arr[j] < arr[i]) {
break;
}
}
if (j != i - 1) { // j != i-1 说明至少完成了一轮排序
temp = arr[i];
// 把正确位置后面的 已排序数据 全部后移一位
for (k = i - 1; k > j; k--) {
arr[k + 1] = arr[k];
}
arr[k + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
}