思路及疑惑后的思考解答
package sort;
import java.util.Arrays;
/**
* 插入排序(Insertion Sorting)的基本思想是:
* 把n个待排序的元素看成为一个有序表和一个无序表
* 开始时有序表中只包含一个元素,无序表中包含有n-1个元素
* 排序过程中每次从无序表中取出第一个元素
* 把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
*
* (1)其实这是同一个数组,只不过从第二个元素开始和第一个比较,接着该数组的下一个元素
* 判断该数组的大小,并为其让位,找到合适的位置插入即可
* (打牌时,拿牌,根据拿牌的花色和大小,边拿牌,边比较,边插入)
* (2)insertIndex >= 0 保证在给insertVal 找插入位置,不越界
* insertVal < arr[insertIndex] 待插入的数,还没有找到插入位置
* (3)问:1.插入的时候 arr[insertIndex + 1] = insertValue;???????????
* 答:int insertIndex = i - 1;i是当前元素的位置,insertIndex - 1是当前元素的前一个位置;
* 这个这里减一,在这里再加上一,即是当前元素的位置
*
* 问:2.为什么要insertIndex - 1 在arr[insertIndex + 1] = insertValue;这里不就迷糊了?
* 答while (insertIndex >= 0 &&arr[insertIndex] > insertValue)
* 如果不 - 1的话,insertIndex还是当前的元素,即无法比较与insertValue大小关系
*
* 不过可以修改,便于理解 修改之后容易造成数组越界,需要谨慎处理
* int insertIndex = i ;
* while (insertIndex >= 0 &&arr[insertIndex - 1] > insertValue)
* if(insertIndex != i){
* arr[insertIndex ] = insertValue;
* }
*
* 最简便的方法就是修改定义: 将insertIndex改为preInsertIndex
* */
public class InsertSort {
public static void main(String[] args) {
int[] arr = {101, 34, 119, 1, -1, 89};
insertSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
//定义待插入的数
int insertValue = arr[i];
// 即arr[1]的前面这个数的下标
//从待插入元素的前一个位置开始找
int preInsertIndex = i - 1;//int insertIndex = i - 1;
// 给insertVal 找到插入的位置
// 说明
// 1. insertIndex >= 0 保证在给insertVal 找插入位置,不越界
// 2. insertVal < arr[insertIndex] 待插入的数,还没有找到插入位置
// 3. 就需要将 arr[insertIndex] 后移,给待插入的数腾位置
while (preInsertIndex >= 0 && arr[preInsertIndex] > insertValue) { //while (insertIndex >= 0 &&arr[insertIndex] > insertValue){
arr[preInsertIndex + 1] = arr[preInsertIndex];//比其小的后移位置,给其让地方
preInsertIndex--;
}
// 当退出while循环时,说明插入的位置找到
// int insertIndex = i - 1;i是当前元素的位置,insertIndex - 1是当前元素的前一个位置;
// 这个这里减一,在这里再加上一,即是当前元素的位置
if (preInsertIndex + 1 != i) {//{if (insertIndex != i)
arr[preInsertIndex + 1] = insertValue;//arr[insertIndex] = insertValue;
}
}
/*
每一步的演变过程
int insertValue = arr[1];
int insertIndex = 1 - 1;
while (insertIndex >= 0 && arr[insertIndex] > insertValue){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex --;
}
//找到插入的位置了
arr[insertIndex + 1] = insertValue;
insertValue = arr[2];
insertIndex = 2 - 1;
while (insertIndex >= 0 && arr[insertIndex] > insertValue){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex --;
}
//找到插入的位置了
arr[insertIndex + 1] = insertValue;
insertValue = arr[3];
insertIndex = 3 - 1;
while (insertIndex >= 0 && arr[insertIndex] > insertValue){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex --;
}
//找到插入的位置了
arr[insertIndex + 1] = insertValue;
insertValue = arr[4];
insertIndex = 4 - 1;
while (insertIndex >= 0 && arr[insertIndex] > insertValue){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex --;
}
//找到插入的位置了
arr[insertIndex + 1] = insertValue;
insertValue = arr[5];
insertIndex = 5 - 1;
while (insertIndex >= 0 && arr[insertIndex] > insertValue){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex --;
}
//找到插入的位置了
arr[insertIndex + 1] = insertValue;*/
}
}