面试必考排序图文讲解插入排序
Posted 果汁简历
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试必考排序图文讲解插入排序相关的知识,希望对你有一定的参考价值。
https://mp.weixin.qq.com/s/WFojXY4Ectfc4brNDp3SKg
插入排序
对于插入排序,大部分资料都是使用扑克牌整理作为例子来引入的,我们打牌都是一张一张摸牌的,每摸到一张牌就会跟手里所有的牌比较来选择合适的位置插入这张牌,这也就是直接插入排序的中心思想,我们先来看下动图:
相信大家看完动图以后大概知道了插入排序的实现思路了。那么我们就来说下插入排序的思想。
插入排序的思想
从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中从后向前扫描
如果该元素(已排序)大于新元素,将该元素移到下一位置
重复步骤 3,直到找到已排序的元素小于或者等于新元素的位置
将新元素插入到该位置后
重复步骤 2~5
理解上述思想其实并不难,我们来看看用 Java 怎么实现:
public class Test09 {
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
private static void printArr(int[] arr) {
for (int anArr : arr) {
System.out.print(anArr + " ");
}
}
private static void insertionSort(int[] arr) {
if (arr == null)
return;
int j;
int temp;
for (int i = 1; i < arr.length; i++) {
// 设置哨兵,拿出待插入的值
temp = arr[i];
j = i;
// 然后寻找正确插入的位置
while (j > 0 && arr[j - 1] > temp) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = temp;
}
}
public static void main(String[] args) {
int[] arr = {6, 4, 2, 1, 8, 3, 7, 9, 5};
insertionSort(arr);
printArr(arr);
}
}
插入排序的时间复杂度和空间复杂度分析
对于插入的时间复杂度和空间复杂度,通过代码就可以看出跟选择和冒泡来说没什么区别同属于 O(n²) 级别的时间复杂度算法 ,只是遍历方式有原来的 n n-1 n-2 … 1,变成了 1 2 3 … n 了。最终得到时间复杂度都是 n(n-1)/2。
对于稳定性来说,插入排序和冒泡一样,并不会改变原有的元素之间的顺序,如果遇见一个与插入元素相等的,那么把待插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序仍是排好序后的顺序,所以插入排序是稳定的。
对于插入排序这里说一个非常重要的一点就是:由于这个算法可以提前终止内层比较( arr[j-1] > arr[j])所以这个排序算法很有用!因此对于一些 NlogN 级别的算法,后边的归并和快速都属于这个级别的,算法来说对于 n 小于一定级别的时候(Array.sort 中使用的是47)都可以用插入算法来优化,另外对于近乎有序的数组来说这个提前终止的方式就显得更加又有优势了。
插入排序总结:
插入排序的算法时间平均复杂度为O(n²)。
插入排序空间复杂度为 O(1)。
插入排序为稳定排序。
插入排序对于近乎有序的数组来说效率更高,插入排序可用来优化高级排序算法
到现在,我们的三种简单排序就告一段落了,下面我们将直接进入 归并排序 和 快速排序 的讲解。这两个算法也是面试上的常客了,所以你准备好了么?
相关文章
求职攻略
招聘,求职干货每日分享,扫码关注每日收新
文章转自 南尘,关注作者点击如下跳转关注。
以上是关于面试必考排序图文讲解插入排序的主要内容,如果未能解决你的问题,请参考以下文章