- 线性表:
- 顺序存储、链式存储、队列、栈:
- 树:
- 度、层、根、节点;
- 二叉树种类:
- 满二叉树:树中所有节点的度为2或0,且度为0的结点都位于最下层;
- 完全二叉树:树中所有节点的编号与满二叉树中的编号相同;
- 二叉排序树:左子树所有的值<=根结点,右子树所有的值>根结点;
- 平衡二叉树:AVL树,特殊的二叉排序树,左右子树的高差<=1;
- 从一颗空树开始建立,保证左子树不大于根节点,右子树大于根节点;
- 每次插入节点,同时满足两个要求:1.left <= root < right,2.所有节点的平衡因子<=1;
- 当插入节点后破坏了平衡二叉树的平衡,则需要动态调整节点,调整方法为每次调整距离新插入节点的最近的不满足平衡二叉树要求的子树;
- 哈夫曼树:度为0或2,权值越大,距根越近,带权路径最小;
- 遍历、删除、插入、前、中、后、层次、递归、非递归;
- 图:有向图、无向图、有环、无环、深度、广度
- 排序:以下均从小到大排列
- 冒泡排序:
#include <vector> using namespace std; //思想:从队列头开始,每次比较相邻的两个结点,左侧大则交换,直到最后,重复多趟; void Bubble(vector<int>& arr) { for (int i = 0; i < arr.size() - 1; i++) for (int j = 1; j < arr.size() - i; j++) if (arr[j-1] > arr[j]) Swap(arr, j - 1, j); }
- 选择排序:
#include <vector> using namespace std; //在队列中每次选择最大值放在未排序队列的对尾,重复多次 void Select(vector<int> &arr) { for (int i = 0; i < arr.size() - 1; i++) { int max = 0; for (int j = 1; j < arr.size() - i; j++) if (arr[j] > arr[j-1]) max = j; Swap(arr, max, arr.size() - i - 1); } }
- 插入排序:
#include <vector> using namespace std; //队头开始视为有序队列,每次插入一个数值,调整数值到有序位置,重复多次 void Insert(vector<int>& vec) { for (int i = 1; i < vec.size(); i++) for (int j = i; j > 0; j--) if (vec[j] < vec[j-1]) Swap(vec, j-1, j); else break; }
- 希尔排序:
#include <vector> //将队列分组,组内插入排序,初始每两个数值一组,分组数值数量倍数增加,直至全部队列为一组; using namespace std; void Shell(vector<int>& arr) { for (int i = 0; i < arr.size(); i += ) { int group_size = 2 * (i + 1); } }
- 归并排序
- 快排、7.桶排
- 堆排:任何非叶结点的值不小于(不大于)其左、右孩子结点的值。
- 根据原始序列建立完全二叉树;
- 从按广度优先遍历最大编号的节点开始调整为大(小)顶堆;
- 其根节点的值需要大(小)于当前节点的值,如果不大于则交换两个节点的值;
- 然后检查交换后的大编号的节点及其子节点的值,按步骤3检查;
- 重复步骤3、4,直到树的根节点为止;
- 交换根节点及最大编号的节点的值,一轮结束,找出最大值,重复步骤1~6,直到树为空;
- 冒泡排序:
- 查找:顺序、二分、分块、hash、B+树、B-树、KMP、普利姆、克鲁斯卡尔、迪杰斯特拉、弗洛伊德
C++学习汇总---3.1计算机基础---数据结构
最新推荐文章于 2024-07-25 19:28:17 发布