插入排序
简介
插入排序的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序
列,对于未排序数据,在已排序的序列中从后向前扫描,找到相依的插入位置。插
入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),
因而再从后像前扫描的过程中,需要反复把已排序的元素逐步向后挪位,为最新的
元素提供插入空间。
描述过程
1.从第一个元素开始,该元素可以认为已经被排序。
2.取出下一个元素,在已排序的元素序列中从后向前扫描。
3.如果该元素(宝库已排序)大于新的元素,该元素移动到下一个位置。
4.重复第3步,直到找到已排序的元素小于或者等于新元素的位置。
5.将新元素插入到该位置后,重复2~5步。
演示图
第一步:默认是第一个数已排序
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fe27a1177eec6eda37aa962c1440e080.jpeg)
第二步 44比3大就默认已排序到第二的位置
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7e38c412df18f15ec7425d74ebf25210.jpeg)
第三步 取出38从后向前对比
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/159f300bb8e3ea4e7d2426a8cc9a5b8d.jpeg)
第四步:从后向前对比,放入第2个位置
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9f24e61985de91f6804bfeac30037246.jpeg)
第5步:依次类推
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fb72d6d286a2dd34bbc1c052e67cf5d0.jpeg)
大白话理解
一个数组中,默认第一个元素已经被排序了。取出第二个元素跟第一个元素比较大
小。大的就原地插入,小就向前插入。取出第三个元素从后向前依次比较。比第二
元素小就继续跟第一个元素比较。比第二元素大就原地插入。依次类推,直到所有
元素比较完,排序就完成了。
代码演示
public class InsertSort {
public static void main(String[] args) {
int[] arr = {8,1,9,2,7,4,5,3,6};
sort(arr);
}
public static void sort(int[] arr) {
if(arr == null || arr.length <= 1) {
return ;
}
int current;
for(int i = 0; i < arr.length -1; i++) {
current = arr[i+1];
int preIndex = i;
while(preIndex >= 0 && current < arr[preIndex]) {
arr[preIndex+1] = arr[preIndex];
preIndex --;
}
arr[preIndex +1] = current;
}
System.out.println(Arrays.toString(arr));
}
}
结论
插入排序 | |
---|
平均时间复杂度 | O(n²) |
最好情况 | O(n) |
最坏情况 | O(n²) |
空间复杂度 | O(1) |
排序方式 | In-place (内排序) |
稳定性 | Y |