排序总结
时间复杂度 | 空间复杂度 | 是否能有稳定性 | |
选择 | O(N*N) | O(1) | × |
冒泡 | O(N*N) | O(1) | ✔️ |
插入 | O(N*N) | O(1) | ✔️ |
归并 | O(N*logN) | O(N) | ✔️ |
快排(一般指3.0) | O(N*logN) | O(N*logN) | × |
堆 | O(N*logN) | O(1) | × |
基数排序作为不基于比较的排序,有稳定性
基础类型的排序一般排序用快排,因为其时间复杂度常数项更小,需要保持稳定定用归并,不想占用额外空间用堆排序
非基础类型的排序可以用归并,因为有稳定性
希尔排序:多轮插入排序
排序优化:
样本N较大时,先用快排划分为一个个N较小的样本,在小样本上使用插入排序(插入排序时间复杂度常数项极低)
哈希表查找 O(1) 有序表查找 O(logN)
笔试:不需要考虑空间复杂度
面试:空间复杂度尽量小
链表
基础题:
反转单向链表和双向链表 打印两链表公共部分
判断回文链表
笔试做法:快慢指针找到链表中间(链表长度为奇数/偶数 code不一样),栈
面试做法:快慢指针找到链表中间,右半部分链表反转,判断回文,恢复链表
将单向链表按某值划分成左边小,中间相等,右边大的形式
笔试做法:每个节点放在数组里,数组做partition,把节点串起来
面试做法:六个变量,小于/等于/大于区域的头/尾,最后连起来(要注意三个区域是否为空)
复制链表,链表节点除有next指针外,还有一个rand指针,随机指向链表某个节点或为空
笔试做法:哈希表(key:老节点 value:新节点)
面试节点:把新节点串在老节点后面(再后面是下一个新节点),省掉哈希表
标签:总结,复杂度,笔试,链表,logN,排序,节点 From: https://blog.51cto.com/u_15724083/7419818