一个小菜比的记录笔记,如有说错烦请指正
最近花了几天时间来学习数组排序,今天记录第二个排序算法,直接插入排序
思想如下:
个人理解:
把一个数组想象成一个有序一个无序数组,先将无序数组的第一个数值放入有序数组的第1位,下标位'0',拿出无序数组的 第'1'个元素 与 有序数组的第'0'个元素 进行比较,如果有序数组的 第'0’个元素比 无序数组的第 ‘1’个元素 大 则有序数组右移,将有序数组的第'0'位右移到第'1‘位,将无序数组的第'1'个元素插入有序数组的第'0'个元素
官方一点的解释:
把n个待排序的元素分为两组,一组是已排序(初始时只有1个元素),一组未排序(初始时包含n-1个元素)。排序过程中每次从未排序组中取出第一个元素,把它与已排序组的元素进行比较,插入到已排序组的适当位置,使之成为新的有序组。
可能这么解释很难理解,所以拿出一组数据进行排序
原始数组
9,3,5,2,1
第一次排序
3,9,5,2,1
第二次排序
3,5,9,2,1
第三次排序
2,3,5,9,1
第四次排序
1,2,3,5,9
下图借鉴老师图片:
代码如下
int[] arr = randomArr();
System.out.println("排序前:" + Arrays.toString(arr));
//拿到第'1'位元素,因为已假设第0位在有序数组中,所以直接从第'1'位开始拿元素,与前一位进行比较
for (int i = 1; i < arr.length; i++) {
int temp = arr[i];
//与前一下标对比 如果小于,进入循环,查找当前元素 第一个小于的 元素
if (temp < arr[i - 1]) {
//寻找 当前元素 第一个小于的元素
for (int j = 0; j < i; j++) {
//如果找到 当前元素 第一个小于的元素
if(arr[j] > temp) {
/*
例如数组为
9,3,5,2,1
第 1次 发现 9 > 3
所以 数组应右移为 9 9 5 2 1
从j(第0位)右移到j+1位 右移 i(1) - j(0)
然后将 3 赋值给 第 0 位
赋值后 变为 3,9,5,2,1
*/
System.arraycopy(arr,j,arr,j+1,i - j);
//此时 数组 已 右移成为 9 9 5 2 1 所以需要将arr[j]位变为 3
arr[j] = temp;
//终止循环
break;
}
}
}
}
System.out.println("排序后:" + Arrays.toString(arr));