1、介绍
插入排序属于内部排序法,是想要排序的元素寻找合适的位置以插入的方式进行排序。
2、思想
把 n 个待排序的元素看成一个有序表和一个无序表 (有序和无序指的是大小顺序),开始有序表有 i 个元素、无序表有 n-i 个元素,i 开始为1,随着插入的次数增长,每次排序取出无序表的第一个元素,然后跟有序表中的元素进行比较,找到合适的位置插入、后面的元素向后偏移。
3、图解
4、代码实现
/**
* 平均时间复杂度 O(n²) 最好直接复杂度 O(n) 最坏时间复杂度 O(n²) 、内排序、稳定、空间复杂度 O(1)
*/
public static void main(String[] args) {
int[] list = new int[10];
for (int i = 0; i < list.length; i++) {
list[i] = Integer.valueOf((int) (Math.random()*500));
}
//被插入的值
int insertNumber = 0;
//被插入值的下标
int insertArrayMaxIndex = 0;
// 找到的位置
int insertIndex = 0;
for (int i = 0; i < list.length-1; i++) {
//被插入的值
insertNumber = list[i+1];
//被插入值的下标
insertArrayMaxIndex = i+1;
for (int j = 0; j < i+1; j++) {
if(list[j]>=list[i+1]){
// 找到被插入数据的下标
insertIndex = j;
// 进行偏移
// 偏移的思想从最后面有序表的元素向后覆盖、然后被插入的下标的值和原来的值会相同
// 将插入的值插入到被插入数据的下标即可
while (insertArrayMaxIndex>j){
list[insertArrayMaxIndex] = list[insertArrayMaxIndex-1];
insertArrayMaxIndex--;
}
list[insertIndex] = insertNumber;
// 偏移和插入成功就不用比较了,直接退出
break;
}
}
}
for(int i:list){
System.out.print(i+"\t");
}
}
5、演示