一:基本思想
将n个待排序的元素分成俩组,第一组为有序组,第二组为无序组,有序组里面刚开始只有第一个元素,剩下的元素都在无序组里,然后从无序组里面依次取出元素放到有序组里面进行从小到大(从大到小)排序,直到无序组里面没有数据后得到的有序组,就是我们得到的有序序列。
二:举例(从小到大排序)
数组为 int arr[] = {7,5,8,3,2,9}
第一趟排序:
首先7假设为单独一个数组,从第二个元素5,开始遍历,5比7小
排序结果 5 7 8 3 2 9
第二趟排序:
在前一次排序基础之上,取出下一个元素8进行比较。8比它前一个位置元素大,位置不变
排序结果 5 7 8 3 2 9
第三趟排序:
同样在第二次排序基础上,取出下一个元素3,与8比较,较小,继续向前与7比较,还是小,继续与5比较,比5小,所以放在5的前面
排序结果 3 5 7 8 2 9
继续如上步骤
第四趟排序结果 2 3 5 7 8 9
第五趟排序结果 2 3 5 7 8 9
图片分析
动图分析
三:编程实现
注意(代码关键部分): 取出某个数据与前面数据进行比较时,例如上面第三趟排序,取出数是3,3与8比较,比8小,所以3那个位置的值变成了8,这样就有了俩个8。
也就是 5 7 8 8 2 9
然后3再与8前面的7比较,7比3大,所有重复以上步骤,8原来位置的8变成了7,这样又有俩个7。
5 7 7 8 2 9
然后再依次进行,直到3遍历到5,和这个位置数字比较,3小于5,但是5前面没有数,所以原来位置的7变成了5,5这个位置被3赋值。
3 5 7 8 2 9
代码如下
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr={7,5,8,3,2,9};
System.out.println("原数组"+Arrays.toString(arr));
Insert(arr);
System.out.println("最终数组"+Arrays.toString(arr));
}
public static void Insert(int[] arr){
for (int i = 1; i < arr.length; i++) {
//从第二个数开始,取出然后和前一个数进行比较
int insertVal=arr[i];//当前取出的数
int insertIndex=i-1;//当前取出数的前一个索引
//判断: 当前取出数的前一个索引大于等于0,防止越界,并且当前数小于它前面的数
(这部分上面有详细讲解)
while (insertIndex >= 0 && arr[insertIndex] >= insertVal){
//因为取出数小,要往前遍历插入,所以比它大的数往后移动
arr[insertIndex+1]=arr[insertIndex];
//循环向前遍历数
insertIndex--;
}
//判断结束后,取出数找到比它小的数,并将当前数赋值到当前比较数位置上
//将5赋值到第一个位置
arr[insertIndex+1]=insertVal;
System.out.println("第"+i+"轮插入后"+Arrays.toString(arr));
}
}
}
结果查看
原数组[7, 5, 8, 3, 2, 9]
第1轮插入后[5, 7, 8, 3, 2, 9]
第2轮插入后[5, 7, 8, 3, 2, 9]
第3轮插入后[3, 5, 7, 8, 2, 9]
第4轮插入后[2, 3, 5, 7, 8, 9]
第5轮插入后[2, 3, 5, 7, 8, 9]
最终数组[2, 3, 5, 7, 8, 9]