1.基本介绍
插入排序(Insertion Sort)是一种简单直观的排序算法。
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,从而使得整个序列逐步有序。
2.数据演示
第0次排序为6 (2 5 1 7 3)
第1次排序为2 6 (5 1 7 3)
第2次排序为2 5 6 (1 7 3)
第3次排序为1 2 5 6 (7 3)
第4次排序为1 2 5 6 7 (3)
第5次排序为1 2 3 5 6 7
如图所示,将红色数组排成有序数组,那么 在后面无序数组第一个元素插入到有序数组的对应位置。反复n-1次即可完成。
3.具体步骤
1. 从第一个元素开始,该元素可以认为已经被排序。
2. 取出下一个元素,在已经排序的元素序列中从后向前扫描。
3. 如果已排序的元素大于新元素,将已排序的元素向后移一位。
4. 重复步骤 3,直到找到已排序元素小于或者等于新元素的位置。
5. 将新元素插入到该位置。
6. 重复步骤 2 - 5,直到所有元素都被排序。
思路:小编认为在外循环中确定执行的次数,以及确定无序数组第一个元素的下标,因为每次有序数组排序后,无序数组中取值要跟着变化;内部循环,要进行排序,以及插操作。
4.代码如下
public class insert {
public static void main(String[] args) {
int arr[]={6,2,5,1,7,3};
for(int i=1;i< arr.length;i++){
int insert=arr[i];
//无序数组的第一个对比的数
int insertIndex=i-1;
//对比数前一个数的索引
while (insertIndex>=0 && insert<arr[insertIndex]){
arr[insertIndex+1]=arr[insertIndex];
insertIndex=insertIndex-1;
}
arr[insertIndex+1]=insert;
System.out.println("第"+i+"次排序为"+Arrays.toString(arr));
}
System.out.println("最终排序为"+Arrays.toString(arr));
}
}
小编这里,将无序数组的值保存在一个变量里面,当执行满足小于前一个数时,将有序数组的值前移,最后不满足条件后,将变量的值插入到指定位置。
例如
2 6 5 1 7 3
先将5先前比较,发现 6 > 5,所以现将5存在变量里,6的值向前移变成
2 6 6 1 7 3
然后继续比较5>2,那么跳出循环,将5的值插入得到
2 5 6 1 7 3
演示结果
第1次排序为[2, 6, 5, 1, 7, 3]
第2次排序为[2, 5, 6, 1, 7, 3]
第3次排序为[1, 2, 5, 6, 7, 3]
第4次排序为[1, 2, 5, 6, 7, 3]
第5次排序为[1, 2, 3, 5, 6, 7]
最终排序为[1, 2, 3, 5, 6, 7]
5.时间演示
时间在循环执行前后分别进行打印,在100000个数据中排序只要2秒。
6.总结
插入排序的平均时间复杂度为 O(n^2) ,空间复杂度为O(1) 。它在对小规模数据进行排序时表现较好,并且代码实现相对简单。
但是缺点是
1. 时间复杂度较高:在最坏情况下,即数组完全逆序时,时间复杂度为 ,对于大规模数据的排序效率较低。
例如:2 3 4 5 1
第一次:2 3 4 5 1
第二次:2 3 4 5 1
第三次:2 3 4 5 1
第四次:1 2 3 4 5
2. 不适合大规模数据
3. 稳定性有限
最后限于小编能力有限,欢迎各位uu提出宝贵意见。
要是觉得小编的作品对你来说有帮助的话就点个小小的赞吧。