大N领导单独找我聊了两句:搞框架的同时别忘了算法,2024Java笔试题

1. 先来说说直接插入排序

==============

1.1 算法思想

========

插入排序就是每次将一个待排序的数据插入到一个前面已排好序的子序列中,初始认为第一个元素就是排好序的序列,依次比较,然后插入到合适位置,直到完成排序为止。

插入排序的关键如下:

  • 将待排序数据分为三部分,已经排好序的数据、下一个需要插入的数据、待排序的数据

  • 每一次都从待排序数据中取出一个需要插入的数据,将其放在哨兵位置;

  • 将哨兵位置的数据(其实就是要插入的数据)与已排好序的数据进行比较,如果符合条件就插入到对应位置,其他数据统一向后移位即可;

1.2 算法实现与解析

===========

算法代码如下(升序):

大牛领导单独找我聊了两句:搞框架的同时别忘了算法

执行结果如下:

大牛领导单独找我聊了两句:搞框架的同时别忘了算法

解析排序步骤过程,如下:

大牛领导单独找我聊了两句:搞框架的同时别忘了算法

步骤说明:

图中绿线框部分代表是已经排好序的列表,箭头指的元素是下一个要插入的元素,黄线框部分为剩下的无序元素。黄方块为每次移动的数据,绿方块表示最后有序列表腾出的位置。

  • 将原始数据array复制到新数组中arrayb中,这步的主要目的是后续不需要声明额外临时变量,也为了后续核心代码实现逻辑简单易懂,减少过多的判断;

  • 第1步将第一个元素作为有序列表(第一元素为2),下一个要插入的元素为5,将5放入哨兵位置,即索引为0的位置;然后依次遍历有序列表中的元素,与哨兵位的值5比较,这里只有2和5比较,2小于5,所以不需要改变位置;

  • 第2步有序列表中的元素有2和5,下一个要插入的元素为6,将6放入哨兵位置,即索引为0的位置;然后依次遍历有序列表中的元素(2和5),与哨兵位的值6比较,都小于6,所以不需要改变位置;

  • 第3步有序列表中的元素有2、5、6,下一个要插入的元素为1,将1放入哨兵位置,即索引为0的位置;然后依次遍历有序列表中的元素(2、5、6),与哨兵位的值1比较;第3-1步,由于是倒序遍历,先用有序列表中的6与1进行比较,6大于1,所以6往后移一位;第3-2步,继续遍历,用有序列表中的5与1进行比较,5大于1,所以5往后移一位;第3-3步,继续遍历,用有序列表中的2与1进行比较,2大于1,所以2往后移一位;第3-4步,遍历完有序列表中的元素,要插入的元素和哨兵位的元素相等,终止遍历;然后将哨兵位的元素(当前哨兵位为1)赋值给腾出的空间(腾出的索引位为1);

  • 第4步有序列表中的元素有1、2、5、6,下一个要插入的元素为9,将9放入哨兵位置,即索引为0的位置;然后依次遍历有序列表中的元素(1、2、5、6),都小于哨兵位的值9,所以不用插入,位置不变;

  • 第5步有序列表中的元素有1、2、5、6、9,下一个要插入的元素为3,将3放入哨兵位置,即索引为0的位置;然后依次遍历有序列表中的元素(1、2、5、6、9),与哨兵位的值3比较;第5-1步,由于是倒序遍历,先用有序列表中的9与3进行比较,9大于3,所以9往后移一位;第5-2步,继续遍历,用有序列表中的6与3进行比较,6大于3,所以6往后移一位;第5-3步,继续遍历,用有序列表中的5与3进行比较,5大于3,所以5往后移一位;第5-4步,继续遍历,用有序列表中的2与3进行比较,2小于3,终止遍历;然后将哨兵位的元素(当前哨兵位为3)赋值给腾出的空间(腾出的索引位为3);

第5步完成之后,已完成黄线框中无序元素的排序,排序也就完成啦;最终的结果就是1、2 、3 、5 、6 、9。

这样对比着图看详细说明,是不是好理解了很多。

如果有小伙伴不太理解上面的代码,可以使用定义临时变量作为哨兵的方式,步骤和上面基本一样,只是哨兵不一样,如下:

大牛领导单独找我聊了两句:搞框架的同时别忘了算法

1.3 算法分析

========

主要从时间复杂度、空间复杂度、是否稳定来进行分析:

时间复杂度

分析时间复杂度时,会从最好、平均、最坏三种情况进行分析;

最好时间复杂度:传入的数据是有序的(和最终的结果一致),所以每次遍历,一次就能找到位置,所以插入排序的最好时间复杂度为O(n),和传入的元素个数有关;

最坏时间复杂度:传入的数据完全和要的结果相反,所以每次都需要进行两次循环进行找到合适位置插入,所以最坏时间复杂度为O(n2);

平均时间复杂度也就是:O(n2);

空间复杂度

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习

已经将知识体系整理好(源码,笔记,PPT,学习视频)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

已经将知识体系整理好(源码,笔记,PPT,学习视频)

[外链图片转存中…(img-KVmaWkH2-1711832741039)]

[外链图片转存中…(img-lAiZx8Cd-1711832741039)]

[外链图片转存中…(img-E0HUG4qu-1711832741040)]

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值