摘要:
oo 和归并排序一样, 快速排序也使用了分治思想(Divide & Conquer) 对一个数组进行快速排序, 通常分为三个步骤: 1. 分解: 数组a[p to r]被划分为两个可能为空的子数组a[p to q-1]和a[q to r], 使得a[p to q-1]中的每一个元素都
#include #include #include #include using namespace s... 阅读全文
摘要:
第一题: 给出{1, 2, 3,…, n}的入栈顺序, 输出所有可能的出栈顺序 #include "stdafx.h"
#include #include #include #include #include using namespace std;
int n = 0;
typedef stack Stack;
typedef queue Queue; void dfs(int l... 阅读全文
摘要:
一. 链表结点类 链表结点类最好是定义为链表类的私有内部类. 不过由于该代码用到了模板, 在VS2013下会遇到各种各样的编译问题, 因此改为定义在外部. template
struct Node
{ T data; Node* prev; Node* next; Node(const T& src = T(), Node* p = NULL, No... 阅读全文
摘要:
Dijkstra算法和BellmanFord算法是两大经典的单源最短路径算法. Bellman支持负权重的边, 不支持负环. Dijkstra算法的效率更高, 不支持负边, 用处更广泛.Dijkstra的基本过程如下:初始化每一个节点: 对于源节点, 我们把距离(distance)字段设为0. 其他... 阅读全文
摘要:
广度优先搜索对图G中的边进行系统性的探索来发现可以从源节点s到达的所有节点. 该算法能够计算从源节点到所有可达节点的最小的边数. 所有节点在一开始的时候均被涂上了白色. 在算法推进过程中, 这些节点可能变成灰色或者黑色. 在搜索过程中, 第一次遇到一个节点就称该节点被发现, 此时该节点的颜色将发生改变. 为了理解或调试算法, 我们用灰色代表已经发现但还没有探索邻接边(出边), 用黑色代表已经发现... 阅读全文
摘要:
深度优先搜索算法在搜索过程中对节点进行涂色来指明节点的当前状态. 每个节点的初始颜色都是白色. 在节点被发现后变成灰色. 在其邻接链表被扫描完成之后变成黑色. 该方法可以保证每个节点只在一棵深度优先树中出现, 因此, 所有的深度优先树是不相交(disjoint)的. 除了创建深度优先搜索森林之外, 该方法还在每个节点盖上两个时间戳. 一个是被发现的时间(涂上灰色的时间), 另一个... 阅读全文
摘要:
图的存储最常见的方式是邻接链表和邻接矩阵存储. 邻接矩阵和邻接链表具体是什么这里就不多说了. 由于项目需要, 我需要实现一个能够自动查重的邻接链表, 即不能插入重复结点的邻接链表. 考虑到”不能重复”这一特点, 如果使用stl容器的话, 非map/set/hashmap/hashset莫属. 多的不说, 上代码: 一. 顶点类的定义 enum State
{ WHITE, GRAY, BL... 阅读全文
摘要:
一. 介绍 在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis,他们在1962年的论文《An algorithm for the organization of informa... 阅读全文