2.数组
线性查找 O(N) N/2
二分查找 O(log(N))
3.排序
冒泡排序 O(N*N)
每次遍历比较临近的2个选出最大的一个放到右边,这样最大的一个会到最右
第2次只要遍历到第N-1个
遍历N-1次
选择排序 O(N*N)
每次遍历选出最小的一个放到左边
比冒泡的好处是每次遍历只进行一次交换
插入排序 O(N*N)
给出一个选定位
他左边是有序的
把该选定位和左边有序的依次比较
插入其中合适的位置
4. 栈 队列
数组是数据存储结构
栈 队列作为辅助工具 受限访问
栈只能访问最后插入的数据项 先入后出
出入栈 O(1)
队列 FIFO 先入先出 O(1)
优先级队列 数据项按关键字有序 关键字最小的数据在队头
在多任务系统中进程的优先执行时采用此数据结构
算术运算 后缀表达式
转换
遍历中缀表达式
遇到操作符就操作栈
假如栈顶的操作符不比当前操作符优先级低,就推出栈顶的,遍历直到栈为空或推出一个,压入当前的
否则 压入当前的
(核心思想就是当前的操作符能不能出栈(意味着可以写在后缀表达式上)要看下一个操作符是什么,下一个不比自己高才能出栈加在后缀表达式上, 所以栈的结构也一定是栈底的操作符优先级底,栈顶高)
计算
遍历完表达式
遇到数字就压栈
遇到操作符就从栈里弹出2个数,计算出结果,把结果压栈
遍历完表达式,栈里最后的那个数就是结果
链表
单链表 双端链表 有序链表 双向链表 有迭代器的链表
单链表
在链表头插入
在链表头删除
遍历
没有持有对链表尾部的引用
双端链表
持有对链表尾部的引用
链表的效率
在表头插入 删除 很快 O(1)
查找 删除 插入 O(N)
什么时候使用链表或数组来实现栈和列队呢? 取决于能否预计数据量, 不清楚的话,链表就比数组有更好的适应性
有序链表
插入 删除 O(N)
找到或删除最小值 O(1)
频繁的存取最小项 不需快速插入 可以考虑有序链表
双向链表
可以向前 也可以向后 遍历
希尔排序 O(N(logN)*(logN))
快速排序 O(N(logN))
二叉树
二叉搜索树
左子节点小于父节点 右子节点>=父节点
非平衡树
大部分节点在树的一边
树查找 O(logN)
树的遍历
1
2 3
中序 213
前序 123
后序 231
哈希表
插入 删除 O(1)
缺点
基于数组 大小扩展时很费时
没法简便的有序遍历
如果不需 有序遍历, 能提前预测数据大小,哈希表有优势
特点
把关键字转换为数组下标
开放地址
链表