【面试:基础题04:插入排序】

简介: 【面试:基础题04:插入排序】

【面试:基础题04:插入排序】

01.简介

插入排序是基础排序的一种,它的思路是:有一个有序部分,一个无序部分,我们每一次拿无序部分的第一个元素对有序部分 从后往前进行比较(默认升序情况),如果小于则把比较的元素向后移一位 直到大于某个元素 此时把无序元素插入到这个位置。

02.算法步骤

对于数列{9,3,7,2,5,8,1,4}元素进行升序插入排序

初始有序部分9 无序部分3 7 2 5 8 1 4

第一趟:3 9 7 2 5 8 1 4,有序3 9 无序 7 2 5 8 1 4

第二趟:3 7 9 2 5 8 1 4,有序3 7 9 无序 2 5 8 1 4

第三趟:2 3 7 9 5 8 1 4,有序2 3 7 9 无序 5 8 1 4

第四趟:2 3 5 7 9 8 1 4,有序2 3 5 7 9 无序 8 1 4

第五趟:2 3 5 7 8 9 1 4,有序2 3 5 7 8 9 无序1 4

第六躺:1 2 3 5 7 8 9 4,有序1 2 3 5 7 8 9 无序4

第七趟:1 2 3 4 5 7 8 9,有序1 2 3 4 5 7 8 9 无序空

可以看出几个问题

1.8个元素排序7趟

2.每次都是让无序部分的第一个元素和有序部分进行从后往前的比较 且比较成功 则有序部分向后移 直到比较不成功则 插入无序元素

3.我们这里排序采用的是有序元素向后移 无序元素插入的方式,比无序元素和有序元素依次交换的时间要少得多这是一个优化点

4.我们在有序部分比较不成功时 直接退出 而不是再继续向前比较,这是个优化点

03.代码

public static void main(String[] args) {
    int[] a = {9,3,7,2,5,8,1,4};
    int len = a.length;
    for (int i=1;i<len;i++){
        int j = i-1;
        int t = a[i];// 临时变量 记录无序部分的第一个元素,因为后续有序部分向后移会覆盖这个元素
        System.out.println("第"+(i)+"趟");
        while (j>=0){
            if (t<a[j]) {// 如果无序元素小于有序元素
                a[j+1]=a[j];// 有序元素向后移
            }else {
                break;// 如果无序元素大于等于有序元素 则说明应该插入到此位置 所以这里直接退出
            }
            j--;// 从后向前比较有序元素
        }
        a[++j]=t;// 因为最后j-- 所以需要++才能插入到空出的位置
        for (int k=0;k<len;k++){
            System.out.printf("%d ",a[k]);
        }
        System.out.println();
    }
}

结果

第1趟
3 9 7 2 5 8 1 4
第2趟
3 7 9 2 5 8 1 4
第3趟
2 3 7 9 5 8 1 4
第4趟
2 3 5 7 9 8 1 4
第5趟
2 3 5 7 8 9 1 4
第6趟
1 2 3 5 7 8 9 4
第7趟
1 2 3 4 5 7 8 9

04.插入排序与选择排序与冒泡排序比较

相同点:

1.插入排序与选择排序都是被分为有序部分和无序部分,只不过选择排序是记录最小值下标最后进行交换把无序元素放入有序元素。而插入排序则是把无序部分的一个元素依次从后往前对有序部分的元素进行比较直到比较不成功则插入。

2.和冒泡排序一样插入排序在顺序情况下时间复杂度很优秀,在完全顺序的情况下 插入排序与冒泡排序的时间复杂度都可以达到O(n)水平。

3.插入排序和冒泡排序都是稳定排序。

不同点:

1.插入排序的时间复杂度优于选择排序与冒泡排序,优于他们的原因在于插入排序是移动元素而不是交换元素,交换元素部分的代码 进行了三次移动 所以一次交换等于三次移动。

2.插入排序是稳定排序而选择排序不是稳定排序。

目录
相关文章
|
机器学习/深度学习 搜索推荐 算法
面试时常常考察的java排序算法--选择排序、冒泡排序、插入排序
面试时常常考察的java排序算法--选择排序、冒泡排序、插入排序
【面试:基础篇06:ArrayList扩容机制】
【面试:基础篇06:ArrayList扩容机制】
150 0
|
缓存 C++
【面试:基础篇07:ArrayList与LinkedList源码分析及其性能对比】
【面试:基础篇07:ArrayList与LinkedList源码分析及其性能对比】
139 1
|
存储 安全 算法
Java面试准备-基础篇
Java面试准备-基础篇
175 0
Java面试准备-基础篇
|
消息中间件 缓存 算法
堪称神级的阿里巴巴“高并发”教程《基础+实战+源码+面试+架构》
前言 作为一个普普通通的程序员,如何才能提升自己的能力,在职场上拥有一技之长,这也成为普通的你我,迫切的需求。 拥有什么样的能力才能不被淘汰?答案是:高并发,它几乎成为了每个程序员都想要拥有的经验。 原因很简单:流量是大的电商公司必要的需求,比如,淘宝的双十一会产生大量的高并发,用户上亿,一天的流量就是几十亿,高峰期的并发量上十万。所以,如何抗住高并发,是这种大公司需要面对的。 所以,你要是掌握了这项技术,工资蹭蹭地往你兜里钻。
|
机器学习/深度学习 自然语言处理 算法
机器学习:基础面试知识点
机器学习:基础面试知识点
236 0
机器学习:基础面试知识点
|
存储 缓存 NoSQL
Java基础到就业!项目加面试!之Redis面试大全!
简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以存写速度非常快,因此 redis 被广泛应用于缓存方向。
155 0
Java基础到就业!项目加面试!之Redis面试大全!
|
存储 分布式计算 Java
面试准备之并发基础
面试准备之并发基础
138 0
面试准备之并发基础