在插入排序中,一个数组被分成独立的两个部分,有序的部分和无序的部分。然后将无序的那一部分逐个插入到有序的序列,等无序部分的数列完全插入到有序序列后,整个数组则是有序的。
插入规则:用index记录比插入数据大的数据的下标,用于记录要插入数据插入的位置,初始时index为无序数组中要插入数据的下标。将无序数组的第一个数据从有序数组的最后一个数据进行比较。当有序数组中的数大于要插入的数时,将有序数组中的数字向后移动一位,同时将这个下标用index记录下来。一直向前进行比较,一直到比较的数字小于要插入的数,或者比较到有序数组的开头位置,即下标为0的位置,将要插入的数据插入到下标index的位置。
下面是插入排序的一个案例
在刚开始排序时,将数组分成A:
B:
两个部分,其中A是有序的、B是无序的,下面要做到就是将无序数组B从下标1开始,将每个数据插入到有序数组A中
1、当插入33时,由于33小于41,所以需要将33放入到41的位置,将33放入到33的位置。放置完成后,由于33所在的下标为0,前面已经没有可以比较的数据了,此时结束放置。这时A变成有两个数据的有序数组,无序数组B少了一个数据
2、接着将无序数组的第一下标为2数据6插入到有序数组中,将6从有序数组的最后一个下标处开始比较,
6<41,将41后移一位,6<33,将33后移一位。此时6在下标为0的位置,不需要进行比较,此时的数组如下:
3.将98插入到有序数组中,
98>41,因为A数组是有序的,所以比较结束,98的位置不变,成为有序数组的一部分
4.将75插入到有序数组中
75<98,将98后移一位,75>41,比较结束,将75放在98的位置,此时数组如下
5.将66插入到有序数组A中,
66<98,将98后移一位,66<75,将75后移一位,66>41,比较结束,将66放在44后的位置,此时数组如下
6.将87插入到有序数组A中
87<98,将98后移一位,87>75,比较结束,将87放在75后一个位置,此时数组如下
7.无序数组中的数据完全插入到有序数组中,此时的数组即为有序的
代码如下所示
public void insertSort(int[] arr) {
// 将当前下标所对应的数据插入到之前已经有序的数组中
for (int i = 1; i < arr.length; i++) {
// 要进行插入的数据
int key = arr[i];
//记录找比要插入的数大的结束的位置
int index = i;
// 从后向前找到比key大的值
for (int j = i - 1; j >= 0; j--) {
if (arr[j] <= key) {
break;
}
// 找到比key的值,将它们都向后进行移动,因为key是需要插在有序数组中的某个位置处的
arr[j + 1] = arr[j];
index--;
}
arr[index] = key;
}
}