不稳定
选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法
递归
分治法
确定递归边界
折半查找法
前提有序
二叉树
性质
p116
遍历
先序遍历
根左右
中序遍历
左根右
后序遍历
左右根
层次遍历
使用队列
根结点入队
结点出队,左孩子入队,右孩子入队
堆
大顶堆
非叶子节点大于左右孩子节点
小顶堆
非叶子节点小于左右孩子节点
二叉查找树BST
左子树所有的值都小于根结点的值
右子树所有的值都大于根结点的值
左右子树都是二叉查找树
性能与高度成正比。最小为o(logn),最大为o(n)
平衡二叉树AVL
保证高度最小,对BST的改进
树
存储结构
双亲表示法
数据+双亲位置
双亲孩子表示法
数据+双亲位置+孩子结点指针
孩子结点链表
孩子兄弟表示法
第一个孩子+数据+下一个兄弟指针
兄弟结点链表
遍历
先序遍历
根左右
中序遍历
因为子结点数目不确定所有不考虑
后序遍历
左根右
并查集
p158
B树
图
遍历
深度优先遍历
往深走,走不通就回来
广度优先遍历
按层次访问
最小生成树
权值之和最低
普里姆算法
找到已经连接的节点中与未连接结点最短的边
克鲁斯卡尔算法
选全部边里面最短的边,再判断是否产生回路
哈希表
哈希构造
直接定址法
关键字自身为哈希
很少关键字是连续的 浪费空间需要平移
除留余数法
取模
数字分析法
找到规律
折叠法
关键字分开几个区间加起来获得几位
平方取中法
平方关键字再取中间几位
处理冲突的方法
开放定址法
寻找下一个可用地址
线性探测法
加一再取模
二次探测法
加1....K的平方
减少堆聚
链地址法
每个地址形成一个子链
排序
直接插入排序
从无序区找到一个记录插入到有序区
o(n²)
选择排序
遍历整个序列找到最小的放到最前面
希尔排序
对直接插入排序的改进
每隔一个增量选出一个元素放到一个区间 每个区间进行直接插入排序 做完后缩小增量 逐渐合成一个区间
可以实现宏观上的调整 移动距离远
基数排序
多关键字排序
高位优先排序
最高关键字划分子序列,再对子序列进行次关键字的排序
低位优先排序
从最低关键字开始划分,不产生子序列,每趟都是对整个序列进行排序
需要稳定的算法
基数排序
从最低位开始排序
o(n) 快
链式
分配:分配的不同的子序列 收集:从小到大连接序列
计数
每一趟只比较低关键字,先确定每个子序列的起始位置,再根据位置复制到新空间的合适位置
归并排序
将待排序序列拆成有序子序列(最后到只有2个元素的序列)再合并起来
o(nlogn)
快速排序
将序列划分成 枢轴+其余部分
排序成 比枢轴小+枢轴+比枢轴大 再进行子序列递归
堆排序
建一个大顶堆,获得最大的堆顶,将堆顶与堆尾交换位置,长度减一,再次调整成大顶堆
建堆o(n),最坏复杂度o(nlogn)
线性数据结构
顺序栈
应用
数值转换
括号匹配
循环队列
顺序表
可以在任意位置进行操作
存储位置表示前驱和后继关系
只在表头表尾操作
栈表
应用
一元稀疏多项式操作
稀疏矩阵压缩
三元组顺序表
行列值
链栈与链队列
线性表的链式表示和实现
单链表
双向链表
循环链表
采用连续存储结构
采用链式存储结构