软件设计师:05-数据结构与算法

  • 本章难度在软件设计师中最高,推荐最后一章进行学习
章节 章节
01 - 计算机组成原理与体系结构 07 - 法律法规与标准化与多媒体基础
02 - 操作系统基本原理 08 - 设计模式
03 - 数据库系统 09 - 软件工程
04 - 计算机网络 10 - 面向对象
05 - 数据结构与算法 11 - 结构化开发与UML
06 - 程序设计语言与语言处理程序基础 12 - 下午题历年真题
End - 二周目上午真题 End – 二周目下午真题
End - 临考快速记忆 Java工程师的进阶之路

文章目录

  • 数据结构
  • 一、复杂度
    • 1.1、大O表示法
    • 1.2、时间复杂度
    • 1.3、空间复杂度
    • 1.4、真题
  • 二、渐进符号
  • 三、递归
    • 3.1、时空间复杂度
    • 3.2、递归式
    • 3.3、真题
  • 四、线性结构
    • 4.1、定义
    • 4.2、存储结构
    • 4.3、顺序存储
    • 4.4、链式存储
    • 4.5、真题
  • 五、栈
    • 5.1、定义
    • 5.2、真题
  • 六、队列
    • 6.1、定义
    • 6.2、真题
    • 6.3、栈与队列真题
  • 七、串
    • 7.1、定义
    • 7.2、真题
    • 7.3、串的模式匹配和朴素匹配
    • 7.4、真题
  • 八、数组
  • 九、矩阵
    • 9.1、对称矩阵
    • 9.2、三对角矩阵
    • 9.3、稀疏矩阵
    • 9.4、真题
  • 十、树
    • 10.1、定义
    • 10.2、树的性质
    • 10.3、真题
  • 十一、二叉树
    • 11.1、定义
    • 11.1、真题
    • 11.2、存储结构
    • 11.2、真题
    • 11.3、遍历
    • 11.3、反向构造
    • 11.3、真题
    • 11.4、平衡二叉树
    • 11.4、二叉排序树
    • 11.4、真题
    • 11.5、最优二叉树(哈夫曼树)
    • 11.5、哈夫曼编码
    • 11.5、哈夫曼编码压缩比
    • 11.5、真题
    • 11.6、线索二叉树
    • 11.7、混合题
  • 十二、图
    • 12.1、定义
    • 12.1、真题
    • 12.2、邻接矩阵
    • 12.2、邻接表
    • 12.2、稠密图和稀疏图
    • 12.2、真题
    • 12.3、图的遍历
    • 12.3、真题
    • 12.4、拓扑排序
    • 12.4、真题
  • 十三、查找
    • 13.1、顺序查找
    • 13.2、二分查找
    • 13.3、真题
  • 十四、哈希表
    • 14.1、哈希表定义
    • 14.2、哈希函数构造与处理冲突
    • 14.3、处理冲突扩展
    • 14.4、哈希表的查找
    • 14.5、真题
  • 十五、堆
    • 15.1、定义
    • 15.2、构造
    • 15.3、真题
  • 十六、排序
    • 16.1、定义
    • 16.2、插入排序(稳定 不归位)
    • 16.2、希尔排序(不稳定)
    • 16.2、真题
    • 16.3、选择排序(不稳定 归位)
    • 16.2、堆排序(不稳定 归位)
    • 16.2、真题
    • 16.3、冒泡排序(稳定 归位)
    • 16.3、快速排序(不稳定 归位)
    • 16.3、真题
    • 16.4、归并排序(稳定 不归位)
    • 16.4、真题
  • 十七、杂题
  • 算法
  • 一、回溯法-N皇后问题
    • 1.1、非递归求解
    • 1.2、递归法求解
    • 1.3、真题
  • 二、分治法
    • 2.1、递归的概念
    • 2.2、基本思想
    • 2.3、上午真题
    • 2.4、下午真题
  • 三、动态规划法
    • 3.1、基本思想
    • 3.2、0-1背包问题
    • 3.3、上午真题
    • 3.4、下午真题
  • 四、贪心法
    • 4.1、基本思想
    • 4.2、部分背包问题
    • 4.3、真题
  • 五、算法总和
    • 5.1、动态规划
    • 5.2、贪心法
    • 5.3、回溯法
    • 5.4、分支限界法
    • 5.5、真题


数据结构

一、复杂度

1.1、大O表示法

软件设计师:05-数据结构与算法_第1张图片


1.2、时间复杂度

软件设计师:05-数据结构与算法_第2张图片


1.3、空间复杂度

定义的数据占用多少空间就是空间复杂度

O(n)
软件设计师:05-数据结构与算法_第3张图片

O(n^2)
在这里插入图片描述


1.4、真题

真题1
软件设计师:05-数据结构与算法_第4张图片

真题2
软件设计师:05-数据结构与算法_第5张图片
软件设计师:05-数据结构与算法_第6张图片

真题3
软件设计师:05-数据结构与算法_第7张图片

真题4
软件设计师:05-数据结构与算法_第8张图片
在这里插入图片描述


二、渐进符号

软件设计师:05-数据结构与算法_第9张图片

  • 渐进上界:大于等于平均时间复杂度
  • 渐进下界:小于等于平均时间复杂度
  • 渐进紧致界:等于平均时间复杂度

软件设计师:05-数据结构与算法_第10张图片


真题(如下的O小于平均时间复杂度所以错误)

软件设计师:05-数据结构与算法_第11张图片


三、递归

3.1、时空间复杂度

软件设计师:05-数据结构与算法_第12张图片

软件设计师:05-数据结构与算法_第13张图片

软件设计师:05-数据结构与算法_第14张图片


3.2、递归式

软件设计师:05-数据结构与算法_第15张图片
软件设计师:05-数据结构与算法_第16张图片


3.3、真题

真题1
软件设计师:05-数据结构与算法_第17张图片

真题2
软件设计师:05-数据结构与算法_第18张图片

真题3
软件设计师:05-数据结构与算法_第19张图片

真题4
软件设计师:05-数据结构与算法_第20张图片

真题5
软件设计师:05-数据结构与算法_第21张图片

真题6
软件设计师:05-数据结构与算法_第22张图片


四、线性结构

4.1、定义

在这里插入图片描述


4.2、存储结构

也就相当于一个数组,所以可以直接通过下边快速查询到表中的元素,所以效率高,但是插入和删除会批量移动,所以效率低,简称查询高效率,插删低效率

软件设计师:05-数据结构与算法_第23张图片


4.3、顺序存储

1、插入元素的代码和时间复杂度

  • 最好的情况就是直接在顺序表后面插入一个元素,时间复杂度为O(1)
  • 最坏的情况是在插入一个元素到原来第一个元素的位置,时间复杂度为O(n)
  • 平均复杂度为O(n)

2、删除元素的代码和时间复杂度

在这里插入图片描述

  • 最好的情况就是直接在删除最后一个元素,时间复杂度为O(1)
  • 最坏的情况是删除第一个元素,时间复杂度为O(n)
  • 平均复杂度为O(n)

3、查找元素的代码和时间复杂度

在这里插入图片描述

时间复杂度为O(1),因为这是直接根据数组下边就可以快速查询到对应的元素


4.4、链式存储

软件设计师:05-数据结构与算法_第24张图片

1、插入元素的代码和时间复杂度

软件设计师:05-数据结构与算法_第25张图片
软件设计师:05-数据结构与算法_第26张图片


2、删除元素的代码和时间复杂度

软件设计师:05-数据结构与算法_第27张图片


3、查找元素的代码和时间复杂度

软件设计师:05-数据结构与算法_第28张图片


4.5、真题

真题1(一般没有问最好或者最坏的时间复杂度那就是默认为平均复杂度)

软件设计师:05-数据结构与算法_第29张图片

真题2

删除是要找到删除结点的前面一个结点的位置,循环单链表删除是要找到前面一个结点的位置,也就是要遍历链表,但是插入到尾结点后面就不用遍历直接插入就行

在这里插入图片描述

真题3

软件设计师:05-数据结构与算法_第30张图片
在这里插入图片描述

真题4

软件设计师:05-数据结构与算法_第31张图片

真题5

软件设计师:05-数据结构与算法_第32张图片

真题6

软件设计师:05-数据结构与算法_第33张图片

真题7

软件设计师:05-数据结构与算法_第34张图片

真题8
软件设计师:05-数据结构与算法_第35张图片


五、栈

5.1、定义

软件设计师:05-数据结构与算法_第36张图片
软件设计师:05-数据结构与算法_第37张图片


5.2、真题

真题1
软件设计师:05-数据结构与算法_第38张图片

真题2

软件设计师:05-数据结构与算法_第39张图片

真题3
软件设计师:05-数据结构与算法_第40张图片

真题4(必须先进入abcd,e看情况进入:decba - dceba - dcbea - dcbae)

软件设计师:05-数据结构与算法_第41张图片

真题5
软件设计师:05-数据结构与算法_第42张图片

真题6
软件设计师:05-数据结构与算法_第43张图片

真题7
软件设计师:05-数据结构与算法_第44张图片


六、队列

6.1、定义

软件设计师:05-数据结构与算法_第45张图片


6.2、真题

真题1

软件设计师:05-数据结构与算法_第46张图片

真题2

软件设计师:05-数据结构与算法_第47张图片

真题3(这题和题1一样,这里用代入求出答案)

软件设计师:05-数据结构与算法_第48张图片

真题4

软件设计师:05-数据结构与算法_第49张图片

真题5

软件设计师:05-数据结构与算法_第50张图片

真题6

软件设计师:05-数据结构与算法_第51张图片

真题7

软件设计师:05-数据结构与算法_第52张图片

真题8

软件设计师:05-数据结构与算法_第53张图片


6.3、栈与队列真题

真题1

软件设计师:05-数据结构与算法_第54张图片

真题2(出栈序列有多种,出队和入队序列一定一样)
软件设计师:05-数据结构与算法_第55张图片

真题3
软件设计师:05-数据结构与算法_第56张图片

真题4
软件设计师:05-数据结构与算法_第57张图片

真题5
软件设计师:05-数据结构与算法_第58张图片

真题6
软件设计师:05-数据结构与算法_第59张图片


七、串

7.1、定义

软件设计师:05-数据结构与算法_第60张图片


7.2、真题

真题1
软件设计师:05-数据结构与算法_第61张图片

真题2
软件设计师:05-数据结构与算法_第62张图片


7.3、串的模式匹配和朴素匹配

软件设计师:05-数据结构与算法_第63张图片


软件设计师:05-数据结构与算法_第64张图片


7.4、真题

真题1
软件设计师:05-数据结构与算法_第65张图片

真题2(最长相等前后缀+1)

例如abaab,最长相等前后缀是ab,那么就是2+1=3
例如abaaaba,最长相等前后缀是aba,那么就是3+1=4

软件设计师:05-数据结构与算法_第66张图片

真题3
软件设计师:05-数据结构与算法_第67张图片

a:求 “空” 也就是
aa:求a也就是 0 + 1 = 1
aaa:求aa也就是1+1=
aaab:求aaa也就是2+1=
aaaba:求aaab也就是0+1=
aaabaa:求aaaba也就是1+1=
aaabaaa:求aaabaa也就是2+1=


八、数组

软件设计师:05-数据结构与算法_第68张图片

真题1
软件设计师:05-数据结构与算法_第69张图片

真题2
软件设计师:05-数据结构与算法_第70张图片

真题3
软件设计师:05-数据结构与算法_第71张图片


九、矩阵

9.1、对称矩阵

在这里插入图片描述
软件设计师:05-数据结构与算法_第72张图片
软件设计师:05-数据结构与算法_第73张图片


9.2、三对角矩阵

软件设计师:05-数据结构与算法_第74张图片


9.3、稀疏矩阵

软件设计师:05-数据结构与算法_第75张图片


9.4、真题

真题1
软件设计师:05-数据结构与算法_第76张图片

真题2
软件设计师:05-数据结构与算法_第77张图片

真题3
软件设计师:05-数据结构与算法_第78张图片

真题4
软件设计师:05-数据结构与算法_第79张图片

真题5
软件设计师:05-数据结构与算法_第80张图片


十、树

10.1、定义

软件设计师:05-数据结构与算法_第81张图片
软件设计师:05-数据结构与算法_第82张图片


10.2、树的性质

软件设计师:05-数据结构与算法_第83张图片
软件设计师:05-数据结构与算法_第84张图片
软件设计师:05-数据结构与算法_第85张图片


10.3、真题

真题1
软件设计师:05-数据结构与算法_第86张图片

真题2
软件设计师:05-数据结构与算法_第87张图片
软件设计师:05-数据结构与算法_第88张图片


十一、二叉树

11.1、定义

软件设计师:05-数据结构与算法_第89张图片
软件设计师:05-数据结构与算法_第90张图片
软件设计师:05-数据结构与算法_第91张图片


11.1、真题

真题1
软件设计师:05-数据结构与算法_第92张图片

真题2(二叉树性质3:度0的节点等于度2的节点+1)
软件设计师:05-数据结构与算法_第93张图片

真题3
软件设计师:05-数据结构与算法_第94张图片

真题4
软件设计师:05-数据结构与算法_第95张图片

真题5
软件设计师:05-数据结构与算法_第96张图片

真题6
软件设计师:05-数据结构与算法_第97张图片

真题7
软件设计师:05-数据结构与算法_第98张图片


11.2、存储结构

1、顺序存储

软件设计师:05-数据结构与算法_第99张图片
软件设计师:05-数据结构与算法_第100张图片

2、链式存储

软件设计师:05-数据结构与算法_第101张图片
软件设计师:05-数据结构与算法_第102张图片


11.2、真题

真题1
软件设计师:05-数据结构与算法_第103张图片

真题2
软件设计师:05-数据结构与算法_第104张图片

真题3
软件设计师:05-数据结构与算法_第105张图片

真题4
软件设计师:05-数据结构与算法_第106张图片


11.3、遍历

软件设计师:05-数据结构与算法_第107张图片
软件设计师:05-数据结构与算法_第108张图片
软件设计师:05-数据结构与算法_第109张图片
软件设计师:05-数据结构与算法_第110张图片
软件设计师:05-数据结构与算法_第111张图片


11.3、反向构造

1、先+中


11.3、真题

真题1
软件设计师:05-数据结构与算法_第112张图片

真题2
软件设计师:05-数据结构与算法_第113张图片

真题3
软件设计师:05-数据结构与算法_第114张图片

真题4
软件设计师:05-数据结构与算法_第115张图片

真题5
软件设计师:05-数据结构与算法_第116张图片

真题6
在这里插入图片描述


11.4、平衡二叉树

软件设计师:05-数据结构与算法_第117张图片


11.4、二叉排序树

软件设计师:05-数据结构与算法_第118张图片


11.4、真题

真题1
软件设计师:05-数据结构与算法_第119张图片
真题2
软件设计师:05-数据结构与算法_第120张图片

真题3
软件设计师:05-数据结构与算法_第121张图片

真题4
软件设计师:05-数据结构与算法_第122张图片

真题5
软件设计师:05-数据结构与算法_第123张图片


11.5、最优二叉树(哈夫曼树)

1、定义

软件设计师:05-数据结构与算法_第124张图片

2、构造哈夫曼树

软件设计师:05-数据结构与算法_第125张图片

3、概念

  • 权值越大离根节点越近
  • 给定的权值节点为叶子节点
  • 每个非叶子节点度都为2
  • 总的节点为给定的节点的(2倍-1)

4、规范化构造

  • 从前往后找两个权值最小
  • 小左大右加入末尾(若构造完的权值和原本的权值一样,那么构造完的放右边 )
  • 权值相同从前往后
  • 用时再调用

软件设计师:05-数据结构与算法_第126张图片

在这里插入图片描述


11.5、哈夫曼编码

26个字符可用 2n>=26 n=5位二进制串表示

软件设计师:05-数据结构与算法_第127张图片
软件设计师:05-数据结构与算法_第128张图片


11.5、哈夫曼编码压缩比

软件设计师:05-数据结构与算法_第129张图片


11.5、真题

真题1

叶子节点有n个,度为0的节点数=度为2的节点数+1
节点总数=0度节点数+2度节点数=n+n-1=2n-1

软件设计师:05-数据结构与算法_第130张图片

真题2
软件设计师:05-数据结构与算法_第131张图片

真题3
软件设计师:05-数据结构与算法_第132张图片

真题4
软件设计师:05-数据结构与算法_第133张图片

真题5
软件设计师:05-数据结构与算法_第134张图片

真题6
软件设计师:05-数据结构与算法_第135张图片

真题7
软件设计师:05-数据结构与算法_第136张图片

真题8
软件设计师:05-数据结构与算法_第137张图片

真题9
软件设计师:05-数据结构与算法_第138张图片

真题10
软件设计师:05-数据结构与算法_第139张图片


11.6、线索二叉树

软件设计师:05-数据结构与算法_第140张图片


11.7、混合题

真题1
软件设计师:05-数据结构与算法_第141张图片

真题2
软件设计师:05-数据结构与算法_第142张图片

真题3
软件设计师:05-数据结构与算法_第143张图片


十二、图

12.1、定义

软件设计师:05-数据结构与算法_第144张图片
软件设计师:05-数据结构与算法_第145张图片
软件设计师:05-数据结构与算法_第146张图片
软件设计师:05-数据结构与算法_第147张图片
软件设计师:05-数据结构与算法_第148张图片

可以是非直接路径比如下图1-4可以通过1-3-4,这样求出来的就是最少

软件设计师:05-数据结构与算法_第149张图片
软件设计师:05-数据结构与算法_第150张图片


12.1、真题

真题1
软件设计师:05-数据结构与算法_第151张图片

真题2
软件设计师:05-数据结构与算法_第152张图片


12.2、邻接矩阵

软件设计师:05-数据结构与算法_第153张图片

12.2、邻接表

软件设计师:05-数据结构与算法_第154张图片


12.2、稠密图和稀疏图

软件设计师:05-数据结构与算法_第155张图片


12.2、真题

真题1
软件设计师:05-数据结构与算法_第156张图片

真题2
软件设计师:05-数据结构与算法_第157张图片

真题3
软件设计师:05-数据结构与算法_第158张图片

真题4
软件设计师:05-数据结构与算法_第159张图片


12.3、图的遍历

软件设计师:05-数据结构与算法_第160张图片

1、深度优先搜索(DFS)

软件设计师:05-数据结构与算法_第161张图片
1111软件设计师:05-数据结构与算法_第162张图片

2、广度优先(BFS)

软件设计师:05-数据结构与算法_第163张图片


12.3、真题

真题1
软件设计师:05-数据结构与算法_第164张图片

真题2
软件设计师:05-数据结构与算法_第165张图片

真题3
软件设计师:05-数据结构与算法_第166张图片

真题4
软件设计师:05-数据结构与算法_第167张图片

真题5
软件设计师:05-数据结构与算法_第168张图片

真题6
软件设计师:05-数据结构与算法_第169张图片


12.4、拓扑排序

软件设计师:05-数据结构与算法_第170张图片
软件设计师:05-数据结构与算法_第171张图片
软件设计师:05-数据结构与算法_第172张图片


12.4、真题

真题1
软件设计师:05-数据结构与算法_第173张图片

真题2
软件设计师:05-数据结构与算法_第174张图片

真题3
软件设计师:05-数据结构与算法_第175张图片

真题4
软件设计师:05-数据结构与算法_第176张图片


十三、查找

软件设计师:05-数据结构与算法_第177张图片
软件设计师:05-数据结构与算法_第178张图片
在这里插入图片描述


13.1、顺序查找

软件设计师:05-数据结构与算法_第179张图片


13.2、二分查找

软件设计师:05-数据结构与算法_第180张图片
软件设计师:05-数据结构与算法_第181张图片
软件设计师:05-数据结构与算法_第182张图片


13.3、真题

真题1
软件设计师:05-数据结构与算法_第183张图片

真题2
软件设计师:05-数据结构与算法_第184张图片

真题3

  • 第一轮mid为55,mid小于目标值,将l定位为mid+1
  • 第二轮mid为95,结束

软件设计师:05-数据结构与算法_第185张图片

真题4
软件设计师:05-数据结构与算法_第186张图片

真题5
软件设计师:05-数据结构与算法_第187张图片

真题6
软件设计师:05-数据结构与算法_第188张图片

真题7
软件设计师:05-数据结构与算法_第189张图片

真题8
软件设计师:05-数据结构与算法_第190张图片

真题9
软件设计师:05-数据结构与算法_第191张图片

真题10
软件设计师:05-数据结构与算法_第192张图片

真题11
软件设计师:05-数据结构与算法_第193张图片

真题12
软件设计师:05-数据结构与算法_第194张图片


十四、哈希表

14.1、哈希表定义


14.2、哈希函数构造与处理冲突

哈希表表长一般为不大于散列函数且最接近散列函数的质数

软件设计师:05-数据结构与算法_第195张图片
软件设计师:05-数据结构与算法_第196张图片


14.3、处理冲突扩展

在这里插入图片描述

软件设计师:05-数据结构与算法_第197张图片


14.4、哈希表的查找

软件设计师:05-数据结构与算法_第198张图片


14.5、真题

真题1
软件设计师:05-数据结构与算法_第199张图片

真题2
软件设计师:05-数据结构与算法_第200张图片

真题3
软件设计师:05-数据结构与算法_第201张图片

真题4
软件设计师:05-数据结构与算法_第202张图片

真题5
软件设计师:05-数据结构与算法_第203张图片

真题6
软件设计师:05-数据结构与算法_第204张图片

真题7
软件设计师:05-数据结构与算法_第205张图片


十五、堆

15.1、定义

软件设计师:05-数据结构与算法_第206张图片


15.2、构造

软件设计师:05-数据结构与算法_第207张图片


15.3、真题

真题1
软件设计师:05-数据结构与算法_第208张图片

真题2
软件设计师:05-数据结构与算法_第209张图片

真题3
软件设计师:05-数据结构与算法_第210张图片


十六、排序

Java实现八大排序算法

16.1、定义

软件设计师:05-数据结构与算法_第211张图片

软件设计师:05-数据结构与算法_第212张图片


16.2、插入排序(稳定 不归位)

适用于序列基本上有序

  • 将一个待排序的数组分成两部分,前一部分代表是有序序列,后一部分代表未排序序列
  • 第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列
  • 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置
  • 如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面,直到未排序序列全部扫描完毕为止。

无法归位(元素位置在下一轮可能改变)

public static void insertionSort(int[] arr) {
	// 待插入的数为从下标为1开始,因为先把下标为0的固定住了
    for (int i = 1; i < arr.length; i++) {
    	// 循环与前面的有序序列的每个值进行比较,若有序序列的下标小于0则中断循环
        for (int j = i - 1; j >= 0; j -= 1) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}
  • 最坏(n2):每个未排序序列元素都需与每个已排序序列进行比较(混乱序列{2,1,5,3,7,3,1,3}
  • 最好(n):每个未排序序列元素只需与一个已排序序列进行比较(基本有序序列{1,1,2,4,5,8,6}

在这里插入图片描述
在这里插入图片描述


16.2、希尔排序(不稳定)

软件设计师:05-数据结构与算法_第213张图片
软件设计师:05-数据结构与算法_第214张图片

public static void shellSort(int[] arr) {
    for (int step = arr.length / 2; step > 0; step /= 2) {
        //核心代码就是插入排序,把所有的一替换成step
        for (int i = step; i < arr.length; i++) {
            for (int j = i - step; j >= 0; j -= step) {
                if (arr[j] > arr[j + step]) {
                    int temp = arr[j];
                    arr[j] = arr[j + step];
                    arr[j + step] = temp;
                }
            }
        }
    }
}

在这里插入图片描述
在这里插入图片描述


16.2、真题

真题1
软件设计师:05-数据结构与算法_第215张图片

真题2
软件设计师:05-数据结构与算法_第216张图片

真题3

真题4
软件设计师:05-数据结构与算法_第217张图片


16.3、选择排序(不稳定 归位)

  • 从待排序的元素中选出最小的元素,存放在起始位置,固定住该最小元素
  • 同理取出未固定的元素中的最小元素,存放在起始位置,固定
  • 以此类推,直到全部待排序的数据元素的个数为零。
  • 5个元素只需要选择4次,因为最后一个默认为最大的

public static void selectionSort(int[] arr) {
	// 5个元素只需要选择4次,因为最后一个默认为最大的
    for (int i = 0; i < arr.length - 1; i++) {
        int minIndex = i;
        // 从第二个元素开始比较,找出最小值下标
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        if (minIndex != i) {
            int temp = arr[minIndex];
            arr[minIndex] = arr[i];
            arr[i] = temp;
        }
    }
}

16.2、堆排序(不稳定 归位)

软件设计师:05-数据结构与算法_第218张图片

大顶堆:将堆顶元素取出作为序列最大值,将堆底元素提到堆顶,在进行一次调整堆,将75作为第二大值。。。(产生递增序列,小顶堆则产生递减序列)

在这里插入图片描述


16.2、真题

真题1
软件设计师:05-数据结构与算法_第219张图片

真题2
软件设计师:05-数据结构与算法_第220张图片


16.3、冒泡排序(稳定 归位)

  • 比较相邻的元素,如果第一个比第二个大,就交换他们两个
  • 对每一对相邻元素做同样的工作,从开始的第一对到结尾的最后一对,这步做完后,最后的元素应该会是最大的数
  • 每次过后,需要排序的元素就越来越少,对剩下需要排序的元素重复上面的步骤,直到没有任何一对数字需要比较

public static void bubbleSort(int[] arr) {
    for (int i = 0; i < arr.length - 1; i++) {
        for (int j = 0; j < arr.length - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

在这里插入图片描述


16.3、快速排序(不稳定 归位)

软件设计师:05-数据结构与算法_第221张图片
软件设计师:05-数据结构与算法_第222张图片

// 首元素为基准值
public static void quickSort(int[] arr, int left, int right) {
    if (left >= right) {
        return;
    }
    int i = left, j = right, pivot = arr[i];

    while (i < j) {
    	// 从右开始找比基准值小的元素
        while (i < j && arr[j] >= pivot) j--;
        // 将该元素放在最左侧
        arr[i] = arr[j];
        // 从左开始找比基准值大的元素
        while (i < j && arr[i] <= pivot) i++;
        arr[j] = arr[i];
    }
    arr[i] = pivot;

    quickSort(arr, left, i - 1);
    quickSort(arr, i + 1, right);
}

空间复杂度是log2n

在这里插入图片描述


16.3、真题

真题1
软件设计师:05-数据结构与算法_第223张图片

真题2
软件设计师:05-数据结构与算法_第224张图片

真题3
软件设计师:05-数据结构与算法_第225张图片

真题4
软件设计师:05-数据结构与算法_第226张图片


16.4、归并排序(稳定 不归位)

软件设计师:05-数据结构与算法_第227张图片

在这里插入图片描述

// 分+合 默认值
public static void mergeSort(int[] arr) {
    mergeSort(arr, 0, arr.length - 1, new int[arr.length]);
}

// 分+合
public static void mergeSort(int[] arr, int left, int right, int[] temp) {
    if (left < right) {
        int mid = (left + right) / 2;

        // 向左分解
        mergeSort(arr, left, mid, temp);
        // 向右分解
        mergeSort(arr, mid + 1, right, temp);

        // 合并
        merge(arr, left, mid, right, temp);
    }
}

// 治
public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
    int i = left;    // 左边序列初始索引
    int j = mid + 1; // 右边序列初始索引
    int t = 0;       // temp数组的当前索引

    // 1)先把左右序列按顺序填充到temp数组,直到左右序列有一方处理完毕
    while (i <= mid && j <= right) {
        // 如果左序列的值小于右序列则进行存放并将左序列指针右移
        if (arr[i] < arr[j]) {
            temp[t] = arr[i];
            t++;
            i++;
        } else { // 如果右序列的值小于等于左序列则进行存放并将右序列指针右移
            temp[t] = arr[j];
            t++;
            j++;
        }
    }

    // 2)把有剩余数据的一边序列全部填充到temp
    // 如果左边还有剩余
    while (i <= mid) {
        temp[t] = arr[i];
        t++;
        i++;
    }
    // 如果右边还有剩余
    while (j <= right) {
        temp[t] = arr[j];
        t++;
        j++;
    }

    // 3)将temp数组的元素拷贝回arr
    t = 0;
    int tempLeft = left;
    while (tempLeft <= right) {
        arr[tempLeft] = temp[t];
        t++;
        tempLeft++;
    }
}

16.4、真题

真题1
在这里插入图片描述

真题2
软件设计师:05-数据结构与算法_第228张图片

真题3
软件设计师:05-数据结构与算法_第229张图片

真题4
软件设计师:05-数据结构与算法_第230张图片

真题5
软件设计师:05-数据结构与算法_第231张图片

真题6
软件设计师:05-数据结构与算法_第232张图片

真题7
软件设计师:05-数据结构与算法_第233张图片

真题8
软件设计师:05-数据结构与算法_第234张图片


十七、杂题

真题1
软件设计师:05-数据结构与算法_第235张图片

真题2
软件设计师:05-数据结构与算法_第236张图片

真题3
软件设计师:05-数据结构与算法_第237张图片

真题4
软件设计师:05-数据结构与算法_第238张图片

真题5
软件设计师:05-数据结构与算法_第239张图片

真题6
软件设计师:05-数据结构与算法_第240张图片

真题7
软件设计师:05-数据结构与算法_第241张图片

真题8
软件设计师:05-数据结构与算法_第242张图片

真题9
软件设计师:05-数据结构与算法_第243张图片


算法

一、回溯法-N皇后问题

在这里插入图片描述

软件设计师:05-数据结构与算法_第244张图片

1.1、非递归求解

public class NTest {
    public static void main(String[] args) {
        queen();
    }

    static int N = 4;
    static int[] q = new int[N + 1];
    static int answer = 0; // 方案数

    // 检查放入的皇后是否合法
    public static boolean check(int j) {
        for (int i = 1; i < j; i++) {
            if (q[i] == q[j] || Math.abs(i - j) == Math.abs(q[i] - q[j])) {
                return false;
            }
        }
        return true;
    }

    public static void queen() {
        // 初始化棋盘
        for (int i = 1; i <= N; i++) {
            q[i] = 0;
        }
        
        int j = 1;  // 表示摆放第 j 个皇后
        while (j >= 1) { // 防止回溯时溢出
            // 让该皇后按列摆放
            q[j] = q[j] + 1;

            // 判断皇后位置是否合法且不越界
            while (q[j] <= N && !check(j)) {
                q[j] = q[j] + 1;    // 不合法就往下一个位置摆放
            }

            if (q[j] <= N) {
                // 第j个找到合法位置
                if (j == N) { // 找到一组解
                    answer++;
                    System.out.print("方案" + answer + ": ");
                    for (int i = 1; i < q.length; i++) {
                        System.out.print(q[i] + " ");
                    }
                    System.out.println();
                } else { // 继续摆放
                    j = j + 1;
                }

            } else {
                // 还原第j个皇后的位置
                q[j] = 0;
                // 第j个找不到合法位置,回溯到上一个皇后的位置
                j = j - 1;
            }
        }
    }
}
方案1: 2 4 1 3 
方案2: 3 1 4 2 

1.2、递归法求解

大概的意思就是如下三图,对递归不了解的再去查查资料

(1 2 3 4) (1 2 3) (1 2 3 4) ?
软件设计师:05-数据结构与算法_第245张图片

(1 2 3 4) (1 2 3 4)

软件设计师:05-数据结构与算法_第246张图片

(1 2 3 4) (1 2 3 4)(1 2) ?

在这里插入图片描述

public class NTest02 {
    public static void main(String[] args) {
        queen(1);
    }

    static int N = 4;
    static int[] q = new int[N + 1];
    static int answer = 0;

    // 检查放入的皇后是否合法 (true 合法 | false 不合法)
    public static boolean check(int j) {
        for (int i = 1; i < j; i++) {
            if (q[i] == q[j] || Math.abs(i - j) == Math.abs(q[i] - q[j])) {
                return false;
            }
        }
        return true;
    }
    // 打印解决方案
    public static void answer() {
        answer++;
        System.out.print("方案" + answer + ": ");
        for (int k = 1; k < q.length; k++) {
            System.out.print(q[k] + " ");
        }
        System.out.println();
    }
    
    // 放入皇后
    public static void queen(int j) {
        for (int i = 1; i <= N; i++) {
            q[j] = i;         // 每行都循环按列摆放
            if (check(j)) {   // 不冲突则检查是否摆放完成,否则摆放下一个
                if (j == N) { // 摆放完成
                    answer();
                } else {      // 摆放下一个
                    queen(j + 1);
                }
            }
        }
    }
}

1.3、真题

真题1
软件设计师:05-数据结构与算法_第247张图片

真题2
软件设计师:05-数据结构与算法_第248张图片
软件设计师:05-数据结构与算法_第249张图片

真题3

软件设计师:05-数据结构与算法_第250张图片

软件设计师:05-数据结构与算法_第251张图片


二、分治法

2.1、递归的概念

软件设计师:05-数据结构与算法_第252张图片


2.2、基本思想

软件设计师:05-数据结构与算法_第253张图片


2.3、上午真题

真题1

软件设计师:05-数据结构与算法_第254张图片

真题2
软件设计师:05-数据结构与算法_第255张图片

真题3
软件设计师:05-数据结构与算法_第256张图片

真题4
软件设计师:05-数据结构与算法_第257张图片


2.4、下午真题

真题1

软件设计师:05-数据结构与算法_第258张图片
软件设计师:05-数据结构与算法_第259张图片

真题2

软件设计师:05-数据结构与算法_第260张图片
软件设计师:05-数据结构与算法_第261张图片


三、动态规划法

3.1、基本思想

软件设计师:05-数据结构与算法_第262张图片


3.2、0-1背包问题

视频教程

时空间复杂度O(N x W)

软件设计师:05-数据结构与算法_第263张图片

软件设计师:05-数据结构与算法_第264张图片

public class Plan {
    public static void main(String[] args) {
        int N = 4;  // 物品数量
        int W = 5;  // 背包容量
        int[] v = {0, 2, 4, 5, 6};   // 物品价值数组
        int[] w = {0, 1, 2, 3, 4};   // 物品重量数组
        int[][] f = new int[N + 1][W + 1]; // 子问题解数组

        for (int i = 1; i <= N; i++) {     // 物品编号
            for (int j = 1; j <= W; j++) { // 背包容量
                if (j >= w[i]) { // 选择当前物品
                    // (上一个物品的最优解) 比较 (当前物品价值+剩余容量在上一个物品的最优解)
                    f[i][j] = Math.max(f[i - 1][j], v[i] + f[i - 1][j - w[i]]);
                } else {		 // 不选择当前物品
                    // 直接使用上一个物品的最优解
                    f[i][j] = f[i - 1][j];
                }
            }
        }

        System.out.println("最优解:" + f[N][W]);

        for (int i = 0; i <= N; i++) {
            for (int j = 0; j <= W; j++) {
                System.out.printf("%d", f[i][j]);
                System.out.print(" ");
            }
            System.out.println();
        }
    }
}

3.3、上午真题

真题1

软件设计师:05-数据结构与算法_第265张图片

真题2

软件设计师:05-数据结构与算法_第266张图片

真题3
软件设计师:05-数据结构与算法_第267张图片

真题4
软件设计师:05-数据结构与算法_第268张图片

真题5
软件设计师:05-数据结构与算法_第269张图片

真题6
在这里插入图片描述

真题7
软件设计师:05-数据结构与算法_第270张图片


3.4、下午真题

真题1
软件设计师:05-数据结构与算法_第271张图片

解析

软件设计师:05-数据结构与算法_第272张图片

官方解析
在这里插入图片描述


四、贪心法

4.1、基本思想


4.2、部分背包问题

软件设计师:05-数据结构与算法_第273张图片
软件设计师:05-数据结构与算法_第274张图片


4.3、真题

真题1
软件设计师:05-数据结构与算法_第275张图片

真题2
软件设计师:05-数据结构与算法_第276张图片

真题3
软件设计师:05-数据结构与算法_第277张图片

真题4
软件设计师:05-数据结构与算法_第278张图片


五、算法总和

5.1、动态规划


软件设计师:05-数据结构与算法_第279张图片


5.2、贪心法


5.3、回溯法

软件设计师:05-数据结构与算法_第280张图片


5.4、分支限界法

软件设计师:05-数据结构与算法_第281张图片


5.5、真题

真题1
软件设计师:05-数据结构与算法_第282张图片

真题2
软件设计师:05-数据结构与算法_第283张图片

真题3
软件设计师:05-数据结构与算法_第284张图片

真题4
软件设计师:05-数据结构与算法_第285张图片

真题5
软件设计师:05-数据结构与算法_第286张图片

真题6
软件设计师:05-数据结构与算法_第287张图片

你可能感兴趣的:(软件设计师,软件工程)