什么是插入排序?
*插入排序的基本思想就是:把n个待排序的元素看成一个有序表和一个无序表。
*开始的时候有序表中有1个元素,无须表中包含n-1个元素,排序过程中每次从无需表中取出第一个元素,然后把它与有序表中的元素进行比较,将它插入到有序表中的适当的位置,成为新的有序表。
代码思路:
1,假设有一个指针(index),指向无序数组中的第一个元素,即arr[index]是无序数组中的第一个元素,我们定义一个变量来存储该值:int insetVal=arr[index],现在要将其插入到前面的有序数组中
2,将index前移一步,则指向有序数组最后一个元素,我们定义一个新的变量来存储该指针:insetIndex=index-1;即arr[insertIndex]是有序数组最后一个元素
3,我们需要找到一个比insertVal小的值,并将insertVal插入在该值后面:
如果insertVal>arr[insertIndex],执行插入
如果insetValue<arr[insertIndex],将有序数组后移,腾出插入空间,insertIndex指针前移,再看看前一个元素满足不满足条件,指导找到插入位置。
即循环终止条件为找到插入位置,又分为两种情况:
在有序数组中间找到插入位置
insertVal比有序数组中所有的数逗笑,插入在数组第一个位置(insertIndex=0的情况)
总结(两层循环):
for循环控制走了多少趟:for(int i=1;i<arr.length;i++){ 从无序数组第一个元素开始到数组的最后一个元素结束 }
while循环不断将指针前移,在有序数组中寻找插入位置,并执行插入:while(insertIndex>=0 && insetVal<arr[insertIndex])
代码实现:
public static void insertSort(int[] arr){
int insertVal=0;
int insertIndex=0;
for (int i = 1; i <arr.length ; i++) {
//把要插入的数赋值给inserVal
insertVal=arr[i];
insertIndex=i-1;//即arr[i]的前面这个数的下标
//insertIndex>=0是防止越界,即找到有序数组的第一个位置就结束
//insetVal<arr[insertIndex]表示代插入的数还没有找到插入位置
while(insertIndex>=0&& insertVal<arr[insertIndex]){
//没有找到插入位置就把有序数组后面大于insertVal的元素后移,给新插入的元素提供位置
//然后遍历前面的元素
arr[insertIndex+1]=arr[insertIndex];
insertIndex--;
}
//当退出while循环时,说明插入的位置找到,这是insertValue>insert[index],所以我们查到它后面
//即arr[insertIndex+1]=insertVal
arr[insertIndex+1]=insertVal;
System.out.println("第"+i+"轮插入");
System.out.println(Arrays.toString(arr));
}
}