算法思想
直接插入排序的思想:
- 将数组理解为两个列表:有序列表、无序列表
- 有序列表的最初状态,只包含数组中的第一个元素
- 无序列表的最初状态,包含arr[0]之外的其他所有数组元素
- 按照数组的索引递增的顺序,逐渐将无序列表中的元素加入到有序列表中
=>外层循环for(int i=1;i<arr.length;i++) - 对于要进行插入的元素arr[i],进行如下操作:
1)暂存arr[i]为insertVal,
2)逆向遍历有序列表,直到找到 第一个值小于insertVal的元素,那么,insertVal就应该插在该元素后边的位置。
=>因为有序列表部分实际是存储在数组中的,所以应该在遍历的过程中,应该将 >insertVal的元素都向后移动一个位置(为了给insertVal的插入腾出位置)
算法实现
public static void insert(int[] arr) {
int insertVal;
int insertIndex;
for (int i = 1; i < arr.length; i++) {
insertVal = arr[i];
insertIndex = i-1;
while(insertIndex >= 0 && insertVal < arr[insertIndex]) {
arr[insertIndex + 1]=arr[insertIndex];
insertIndex -- ;
}
if(insertIndex != i-1) {
arr[insertIndex + 1] = insertVal;
}
}
}