插入排序:从未排序的数组中选择一个数,插入一个有序的数组中;代码实现的重点就是找到该数字在有序数组中的位置,并插入
代码理解与实现 1:
int a[] = {5, 3, 9, 6, 2};
for (int i = 0; i < a.length; i++) {
Log.i("chy==初始结果===", "====" + a[i]);
}
/**
* 插入排序外层循环控制循环次数(如果a.length == 5,
* 则只需进行4次循环即可,第一个数字默认有序)
* 循环从第二个数字开始
*/
for (int i = 1; i < a.length; i++) {
int value = a[i]; // 用value记录要插入的数字, 从 i=1开始
int j = 0; // 记录value应该插入的位置
/**
* 内层循环--找寻value应该插入的位置
* 因为要插入的序列是有序的,所以找到对应的位置后,
* 后续的其他位置可以不用比较
*/
for (j = i; j >0; j--) {
/**
* a[j-1], j-1的位置是已经排好序列的末尾位置
* 从末尾位置开始与value进行比较,(本排序默认为从小到大排序)
* 如果已经排序的位置 大于 value, 那我就将末尾位置的数字向后移动一位
* 第一次比较后的数组变化为: a[]={5,5,9,6,2}, 因为 3 保存于value中
* 所以不会丢失; 最后在赋值给a[0]即可
*/
if (a[j-1] > value) {
a[j] = a[j-1];
// 此次处理后,会执行 j--;
} else {
// 此次处理后,会执行 j--;
break;
}
}
/**
* 此时 j 的位置就是应该插入数据的位置,将value 赋值给a[j]即可
* 以第一次比较为例: 上面执行 j--后, j = 0; value = 3;
* 所以a[0] = 3;数组变化由 a[] ={5,5,9,6,2}变为
* a[]={3,5,9,6,2},第一次插入结束;
*/
a[j] = value;
}
for (int i = 0; i < a.length; i++) {
Log.i("chy==结果输出===", "====" + a[i]);
}
插入排序记忆: 选择一个数,向有序数组中插入