随笔分类 - C++算法
摘要:对于一组数据排序 算法使用环境不一样,需要选更优的算法 1、是否包含大量重复元素? -->三路快速排序,否则普通快速排序 2、是否近乎有序?-->插入排序 3、是否取值范围有限?-->计数排序(利用数组下标来确定元素的正确位置。) 4、是否需要稳定排序?-->归并排序,否则快排 5、是否使用链表存储
阅读全文
摘要:处理含有负权环的图 #include <iostream> #include <vector> #include <stack> #include "Edge.h" #include "IndexMinHeap.h" using namespace std; template<typename Gr
阅读全文
摘要:前提不能有负权边,同样借助最小索引堆实现 #include <iostream> #include <vector> #include <stack> #include "Edge.h" #include "IndexMinHeap.h" using namespace std; template<
阅读全文
摘要:先排序,挑最小权值,并利用并查集判断不能形成环 #include <iostream> #include <vector> #include "MinHeap.h" #include "UnionFind5.h" #include "Edge.h" using namespace std; temp
阅读全文
摘要:利用最小索引堆优化prim #include <iostream> #include <vector> #include <cassert> #include "Edge.h" #include "IndexMinHeap.h" using namespace std; template<typen
阅读全文
摘要:#include "MinHeap.h" using namespace std; template<typename Graph,typename Weight> class LazyPrimMST { private: Graph &G; MinHeap<Edge<Weight>> pq;//最
阅读全文
摘要:稠密图 #ifndef DENSEGRAPH_H #define DENSEGRAPH_H #include <iostream> #include <vector> #include <cassert> #include "Edge.h" using namespace std; //稠密图 --
阅读全文
摘要:#include <cassert> #include <vector> template<typename Graph> class ShortestPath { private: Graph &G; int s; //某一个点 bool* visited; int* from;//路径 int
阅读全文
摘要:#include <cassert> #include <vector> template<typename Graph> class Path { private: Graph &G; int s; //某一个点 bool* visited; int* from;//路径 void dfs(int
阅读全文
摘要:#ifndef COMPONENT_H #define COMPONENT_H #include <iostream> #include <cassert> using namespace std; //图的深度优先遍历 template<typename Graph> class Componen
阅读全文
摘要:稀疏图 #ifndef SPARSEGRAPH_H #define SPARSEGRAPH_H #include <iostream> #include <vector> #include <cassert> using namespace std; //稀疏图图 -- 邻接表 class Spar
阅读全文
摘要:查询两个节点是否连接,把两个节点相连,并查集 #ifndef UNIONFIND_UNIONFIND5_H #define UNIONFIND_UNIONFIN5_H #include <iostream> #include <cassert> using namespace std; namesp
阅读全文
摘要:二分搜索树结构性质,比根节点大的放到右子树,小的放到左子树,相等的去替换,依次递归,时间复杂度O^log(n)级别 当数据为有序时,时间复杂度会退化成O^n 为避免有序数据的出现 -->平衡二叉树:红黑树 template<typename Key,typename Value> class BST
阅读全文
摘要:非递归方法 //二分查找法,在有序的数组中,查找target //如果找到了target,返回相应的索引index template<typename T> int binarySearch(T arr[],int n,T target){ int l=0,r=n-1; while (l<=r) {
阅读全文
摘要:堆用在动态数据排序中非常合适 以1索引为开始节点,parent(i) = i /2,left_child (i) =2*i ; right_child(i) = 2*i +1; 最后一个非叶子节点的索引count/2 以0索引为开始节点,parent(i) = (i-1)/2, left_child
阅读全文
摘要:快速排序算法思想: 快速排序是冒泡排序的改进算法。它也是通过不断比较和移动交换来实现排序的,只不过它的实现增大了记录的比较和移动的距离,将关键字较大的元素从前面直接放到后面,关键字较小的元素直接从后面放到前面,从而减小了比较次数和交换次数。 对于近乎有序的数组,可采用起始值为数组中随机数字,否则会退
阅读全文
摘要:算法思想:首先把一个数组中的元素,按照某一方法,先拆分了之后,按照一定的顺序各自排列,然后再归并到一起,使得归并后依然是有一定顺序的 。 算法可自顶向下拆分数组也可以自底向上拆分数组合并 自底向上的归并排序有对索引依赖少的优势,对于链表来说比较适合 //自底向上的归并排序 template<type
阅读全文
摘要:算法思想:类似扑克牌的排序,先固定第0个元素,从第 1 个元素开始向前两两比较大小,然后交换位置 由于插入排序swap会导致性能下降,所以用赋值操作来代替交换达到优化的目的 性能优化思路:先固定第0个元素,从第1个元素开始,先把第1个元素复制一份保存起来,看一下此元素是否应该放在当前的位置(需要大小
阅读全文
摘要:选择排序思想: 从数组中找出第一名位置,在整体中找到最小的元素,然后与第一名交换位置,接下来在剩下的元素中,找到最小的元素,与第二名交换位置,以此类推 时间复杂度为O^n2 #include <iostream> using namespace std; template<typename T> /
阅读全文

浙公网安备 33010602011771号