一、思路分析
将序列看成是两个列表,左边看做有序列表,右边看作无序列表,刚开始有序列表只包含一个元素arr[0],无序列表包含剩余元素arr[1]~arr[n-1];第一趟排序后将无序列表的第一个元素arr[1]合并到有序列表中,有序列表变成(arr[0], arr[1])或者是(arr[1], arr[0]),无序列表包含剩余元素arr[2]~arr[n-1];第二趟排序将无序列表的第一个元素arr[2]合并到有序列表,有序列表变为(arr[1], arr[0],arr[2]),无序列表包含剩余元素arr[3]~arr[n-1],以此类推,直到所有元素都保持有序。
二、图解
()内是有序序列。
三、代码
package com.recorsion;
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr = {5,-3,2,4};
insertSort(arr);
System.out.println(Arrays.toString(arr));
}
/**
* 插入排序
* @param arr
*/
public static void insertSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) { // 总共需要选择arr.length-1趟
// 确定待插入的数据
int insertVal = arr[i + 1];
// 事先默认待插入数据的位置
int insertIndex = i;
// 下面这个循环用于查找正确的待插入数据的位置
while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
// 条件满足,说明需要将有序列表中的数据后移,给待插入数据腾出位置
// 后移
arr[insertIndex + 1] = arr[insertIndex];
// 查找下一个位置是否满足
insertIndex--;
}
// 将待插入数据放入有序列表中
arr[insertIndex + 1] = insertVal;
}
}
}