牛客网算法初级第四期 笔记3

5分钟就是继上节课没有讲完的

排序的稳定性第一个三能否在第二个三前面相同的值

冒泡排序可以实现稳定 6

插入排序可以实现稳定 8

选择排序不可以实现稳定10

归并排序可以实现稳定 11

快速排序做不到实现稳定因为partation的过程做不到稳定

堆排做不到稳定性在建立大根堆的过程中稳定性就会被破坏

   

   

为什么需要稳定性? 17

因为现实世界的业务需要稳定性

   

25分钟

如果数组长度小于60的情况会使用插入排序(因为她的常数项极低) 大于60会使用归并排序但是当左右侧分成的数组小于60 还是使用插入排序

当类型是基础类型的情况直接使用快排因为基础类型之间不差异稳定性不影响他们的顺序当类型是复杂类型的情况使用归并(相同班级的个体可能会不同)
 

32分钟

   

51

   

如果是负数的话 o1在o2前面 ..

返回负数的话第一个参数放在前面

返回正数的话第二个参数放在前面

id降序和升序

   

可以调用系统级的函数 Arrays.sort 里面传入比较器默认是按内存地址进行比较

   

   

堆这个结构也可以使用比较器 1:00时

优先级队列就是堆这个是系统提供的堆

   

需要将比较器放到构造方法里面不然会报错

这个比较器是升序所以是小根堆 id小的放到头部堆顶

   

这样弹出每次弹出堆顶的位置

   

红黑树

   

1:10

   

词频数组不基于比较的排序准备一个数组(长度是给定的范围例如这个是0-60范围的数我们创建61长度的数组) 遍历给定的数组

如果2出现了就在2位置上++

这就是计数排序计数排序(和基数排序)其实就是桶排序的具体一个体现桶就是一种数据状况出现的词频

基数排序只需要准备10个桶个位数十位数这种方式

某个公司面试题年年出现 1:18

   

1:20时借用了桶这个概念但是没有用桶排序

   

1)准备桶如果数组中有N个数就准备N+1个桶

遍历数组找到最小值和最大值如果min==max 就只有一种数最大差值为0

最小值放到0号桶里面最大N号

将最小值和最大值范围等分成N+1个份一个数属于哪个范围就放到哪个桶里面

举个例子:

假设一个数组有9个数 0-99 的范围

0-9放到0号桶里面

   

如果我们有N个数准备了N+1个桶

根据葛农原理一定有一个空桶

相邻两数可能同一个桶也有可能是跨桶

设计一个空桶的目的是否定最大差值一定不来自一个桶内部我们只说一个桶内部的相邻数的差值一定不是我们要的答案答案是不一定只来自空桶两侧的

所以我们需要找全

差值一定来自 :前一个桶的最大值和后一个桶的最小值

   

所以我们在桶里面只存放现在的最大值和最小值因为我们只需要这两个

桶里面只保存三个信息最大值和最小值还有boolean 代表这个桶里面有没有数就是判断是不是空桶

   

例如x第一次进入7号桶修改bool为ture min=x max=x

然后找到自己左边的非空桶的max 和自己的min min-max=差值

   

   

   

代码1:40

   

   

设计这三个数组存放信息索引代表桶

确定这个数要放到第几个桶里面

这个for循环就是找到每一个非空桶

   

第三节因为上次课没有讲完第二节的上面其实都是第二节的

1:48

栈 index代表如果用户想要新加一个数需要放到哪个位置

例如7加入栈中 index代表7要放的位置然后index++

   

如果index==size 栈满了如果用户还想继续加入抛出异常

工程当中不会用数组来实现栈但是这里题目要求写这个东西

   

代码实现: 1:55时

   

   

   

固定数组如何实现队列 1:57时

start和end一开始都指向0位置

end代表新加如果新加入一个数我们需要把这个数放到哪个位置上

start代表如果拿取一个数需要把哪个数给用户

size约束 end和start 就是例如整个数组长度为3

如果size<3 那么就将新加入的数放到end上去

如果size!=0 那么就把start指的数给用户

如果用户让我们加入7

size<3 那么就放到end指向的位置 size+1 end+1

加入6

size<3 那么就放到end指向的位置 size+1 end+1

弹出 7 先进先出

size!=0 弹出start指向的位置 size-1 start+1

加入5

size<3 那么就放到end指向的位置 end已经到底了(那么就将end=0 回到开头) end=0

   

   

如果我们只有start和end的话这两个进行约束代码将会非常复杂这时引入size这个变量进行了解耦和他们之间的关系就非常清晰了

代码实现 2:05时

2:06

   

   

   

2:12

准备两个栈 data栈和min栈

第一个压入4 data和min都压入4

第二个压入5 data压入5 但是min压入4 因为4比5小

代码 2:15

   

peek就是只是返回栈顶不弹出的操作

   

2:17

工程上不会用到但是面试会考因为轻量级 (面试官会问如何使用队列结构来实现图的深度优先遍历,图的深度优先遍历是使用栈实现的所以这里就能够用到了)

(这里可以使用两个队列结构来实现栈结构再完成图的深度优先遍历)

队列结构实现栈结构准备两个队列

当我们需要弹出5的时候我们可以将4321 放入另一个队列这样data队列只有5了就弹出5了

队列就是一个双向链表结构也可以使用动态数组的

2:22时

res就是栈顶弹出

swap() 就是将两个队列进行交换

这里的swap 是直接改变引用

   

   

   

如何用栈结构实现队列结构 2:25

使用两个栈结构 push栈和pop栈用户给我们的放到push栈用户想要拿的放到pop栈就相当于转换一下就是队列了

但是当pop栈里面有数据的情况下 push栈不能倒给pop栈需要把pop栈倒完

还有个限制需要将push栈一次倒完

这就是倒数据的行为就是push栈向pop栈倒数据

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

猜你喜欢

转载自www.cnblogs.com/alalajijun/p/12335385.html