数据结构下
静态查找
顺序查找
元素不需要有序
平均查找长度
顺序查找的平均查找长度
总结:
折半查找(二分查找)
1:
2:
3:
4:
总结步骤如下:
折半查找只适合顺序存储,且排列有序
折半查找补充
最多比较次数:
加上最后r=l的那次比较
就是:
折半查找判定树的构造(一般都是下取整)
1:
2:
3:
4:
5:
6:
…
总结:
树的深度和查找次数的关系:
平均查找长度
真题
c
d
记得下取整,最后加上1
一个demo(找14)
1.
2.
3.
可以用折半查找排序树或者直接写出排序过程
d
(一般都是下取整)
如果下取整没有答案,改为上取整
b
a
b
B
最后一个值就是查找的元素,
对于A
对于b,取值不合理(不在区间内)
b
(下取整不行就上取整)
B
对于D
B
获取选项中的key值
对于A
对于b
对于C
C
动态查找
哈希表
通过哈希函数把一组关键字映射到一个有限的连续的地址区间中
冲突(不同关键字映射到了同一个位置)
哈希表函数构造
一个例子:
哈希表解决冲突
一个例子如下:
第二个例子:
关注对于12的分析
另外一种处理冲突的方法(二次探测在散列)
另外一种处理冲突的方法(链地址法)
哈希表装填因子
装填因子:
真题
b
d
b
a
b
这里是指冲突的这一件事
b
d
同义词的定义:
小顶堆和大顶堆
建立小顶堆的大顶堆
总序列为:
从最下面的根节点开始调整
小根堆的构造
1
2
3
4
5
6
7
总序列为:
真题
d
c
c
排序
直接插入排序
从区间的最后面开始比较
第二步
第三步
第四步
第五步:
直接插入排序是局部有序的,之后每次插入进来还需要动态调整
希尔排序
是不稳定排序
动画演示
计数排序适合待排序的值处于0到9之间的情况
真题
c
a
b
a
d
a
a
简单选择排序
演示的视频
第一趟
一趟确定一个最小元素
第二趟
确定第二小的元素
第一趟
第二趟
第三趟
第四趟
堆排序
堆排序可以归位
真题
直接插入排序:
选择排序:
a
对于a
冒泡排序
第一轮:
1:
2:
…
n-1次
第二轮:
再从a2开始逐一比较。。。
(冒泡冒在最右边,每一次把最大的元素放到的最右边)
每趟排序就可以确定一个元素的最终位置:
也是稳定排序(同样的值,前后顺序不会改变)
一个实际的例子:
第一轮:
交换
再交换
再交换
再交换
第一趟结束(比较了n-1次)
第二趟只需要比较n-2次
第一次比较
第二次比较
交换位置
第三次比较
交换
第四次比较
第五次比较
交换
第二轮结束:
第三轮只需要比较n-3次
快速排序
直到序列长度为1的时候,结束排序。
每次确定只是一个元素的位置,并且以后不会再变化,是归位的排序
不是稳定的排序:
真题
b
对于第二问,首先排除有序的序列2和3
对于a
再分治去找。。
对于d选项:
再递归去排序左右子树
这时候,左边的区间还是要排序。。
选A
D
A(涉及到递归,每次的时间复杂度为O(n)递归n次)(涉及到递归,每次的空间复杂度为O(1),递归n次)
A
D
CC
归并排序
再进行归并:(第一次归并)
第二次归并:
第三次归并
当一边越界后,把另外一边直接放到末尾就行;
真题
b
插入排序:
1
2
5
6
7
9
12
归并排序:
4
10
14
A
带入实际的数字来计算最方便:
C
a
b
(注意D是书写方式是平方)
a
对于归并排序,基本有序的情况比较的次数较少
一共三次(m次)
比较3次(n次)
a
c