数据结构
xuzhangze
这个作者很懒,什么都没留下…
展开
-
栈及栈运用之括号匹配
栈的定义及存储 只能在固定一端进行插入和删除操作的线性结构。进行插入删除操作的一端称为栈顶,另一端称为栈底,插入数据的操作称为压栈,删除数据的操作称为出栈。 栈的储存结构有顺序栈和链链两种。 顺序栈和顺序表基本一样,不同的是顺序栈只能固定在栈顶进行操作。顺序栈除了单个栈外还有共享栈,所谓共享栈就是两个栈共用一快储存空间,当然共享栈一般用于两个栈空间需求相反的原创 2017-11-18 00:21:07 · 8032 阅读 · 1 评论 -
图的深度优先搜索
图的深度优先搜索与广度优先搜索相对应,其思想是先在一条路径上走到终点,然后再回过头走其他路径。如果图中有n个节点,e条边,那么用邻接表存储的图的时间复杂度为O(n+e),用邻接矩阵存储的图的遍历时间复杂度为O(n^2)。 这里实现了用邻接表存储的图的深度优先搜索:void DFS() { size_t size = _v.size(); if(size...原创 2018-04-26 16:34:43 · 257 阅读 · 0 评论 -
图的广度优先搜索
图的搜索方法有广度优先与深度优先搜索方法。这里给出广度优先搜索。 广度优先搜索即先遍历完同一层次的元素,然后再遍历下一层次的元素。用邻接表存储的图的广度优先遍历时间复杂度为O(e),使用邻接矩阵存储的图的广度优先方法时间复杂度为O(n^2)。 给出广度优先搜索代码:void BFS() { size_t size = _v.size(); if(...原创 2018-04-26 16:21:38 · 377 阅读 · 0 评论 -
图的存储结构
这里实现图的两种存储结构——邻接矩阵与邻接表。 邻接矩阵 用邻接矩阵存储图需要用到两个数组——一个存储元素的一维数组和一个存储图关系的二维数组。其实现代码:template<typename V, bool IsDigraph = true>class Map{public: Map(const string str = "") { s...原创 2018-04-26 15:21:45 · 194 阅读 · 0 评论 -
排序算法之基数排序_LSD
基数排序是非比较排序的一种,LSD是基数排序的一种,又称为最低位优先,其基本思想是先按最低位关键码的大小将元素放入一个桶中,然后取出再按次低位的大小执行前面操作,直到最高位为止。LSD的时间复杂度为O(MN)(M为最大的数的位数),空间复杂度为O(N)。 实现:#include <vector>int Pow(const int& left, const int&...原创 2018-04-21 10:46:38 · 1820 阅读 · 0 评论 -
排序算法之计数排序
计数排序的思想特别简单,就是记录下序列中每个元素出现的次数,然后根据保存次数的下标及出现次数将元素放回原数组。时间复杂度为O(N+数据范围),空间复杂度为O(最大数-最小数)。 代码实现:#pragma onceint FindMax(int *array, const int size){ assert(NULL != array && size >...原创 2018-04-19 16:59:07 · 228 阅读 · 0 评论 -
排序算法之归并排序
归并排序即用两两归并的方式进行排序,其基本思想是将数组两两划分,当划分到区域中只有一个元素时返回上一级进行两个区域的归并,这样反复归并就可得到一个有序序列。归并排序的时间复杂度为O(nlgn),空间复杂度为O(n)。 代码实现:#include "compare.hpp"template <typename T>static void _conflation(T *arra...原创 2018-04-12 22:28:47 · 186 阅读 · 0 评论 -
排序算法之交换排序1——冒泡排序
冒泡排序算法是一种简单的排序算法,它是稳定的,其时间复杂度为O(N^2),空间复杂度为O(1),一般而言不会用到这种排序方法,但这是初学者必学的排序方法之一。 算法代码实现:template <typename T>void BubbleSort(T *array, const int size){ assert(NULL != array && ...原创 2018-03-29 10:13:26 · 272 阅读 · 0 评论 -
排序算法之选择排序2——堆排序
堆排序是一个不稳定的排序算法,其时间复杂度为O(nlgn),空间复杂度为O(1)。其基本思想是对数组建立一个初始堆,然后进行一系列的交换和调整,最后得到需要的有序序列。 堆排序的一种实现:template <typename T>void Adjust(T *array, int parent, int size) //调整函数{ assert(NULL !...原创 2018-03-29 09:16:37 · 170 阅读 · 0 评论 -
排序算法之选择排序2—快排
快速排序也叫分区排序,其基本思想是在特定范围内对于某个基准值,将小于这个基准值的元素全部移到这个值的前面,大于这个值的元素全部移到这个值的后面,然后再对前后范围的元素递归进行分区,最终得到一个有序序列。快速排序的时间复杂度为O(nlgn),空间复杂度为O(lgn),当数组元素数量较大时,快速排序要比其他排序都要好,但是当数量级较小时,快速排序的性能可能没有其他排序好。 下面给出快排的实现:...原创 2018-04-09 21:09:37 · 174 阅读 · 0 评论 -
排序算法之选择排序1——直接选择排序
直接选择排序算法是一种简单的排序算法,它的时间复杂度为O(N^2),空间复杂度为O(1),它的时间复杂度与初始状态无关,因此总是做一些“重复性”的动作,并且它是不稳定的。 直接选择排序算法的实现:template <typename T>void SelectSort(T *array, const int size){ assert(NULL != array ...原创 2018-03-26 20:04:22 · 313 阅读 · 0 评论 -
排序算法之插入排序3——希尔排序
希尔排序又被称为减小增量的插入排序法,其时间复杂度在O(N^1.25)到O(1.6N^1.25)之间,空间复杂度为O(1),是一种比较高效的排序算法,希尔排序是一种不稳定的算法。关于希尔排序的介绍在任何一本数据结构书里面都有阐述,这里仅给出希尔排序算法的实现:#pragma once#include "compare.hpp"template <typename T>vo...原创 2018-03-26 18:56:05 · 389 阅读 · 0 评论 -
排序算法之插入排序2——折半插入排序
我们都知道插入法是在要插入的元素前面都已序的情况下进行比较—插入,直接插入法每个元素都有可能会经历多次交换才能找到它本应该待的位置。比如第100个元素,假如它应该待的位置为2,如果用直接插入法的话,就要比较99次,搬移98次。然而它前面的99个元素是已序的,显然有优化的空间,面对已序的序列我们最先想到的就是二分算法,我们可以先用二分法找到这个元素应该待的位置,然后一次性的将这个位置后面的元素后移,...原创 2018-03-26 17:59:45 · 1048 阅读 · 0 评论 -
排序算法之插入排序1—直接插入排序
插入是排序中常用的算法之一,也是每个编程人员必须掌握的排序算法之一。直接插入法的时间复杂度为O(n^2),空间复杂度为O(1),这是一种稳定的算法,其性能与待排序序列的初始状态有关。写这篇文章是为了实现插入排序中的直接插入排序算法。插入排序属于比较排序,因此,文首先定义一个比较器:template <typename T>struct Less{ bool operat...原创 2018-03-19 22:52:32 · 406 阅读 · 0 评论 -
C++实现二叉树的递归遍历与非递归遍历
基本上所有关于二叉树的操作都是基于二叉树的遍历算法来实现的,因此在这里讲一下二叉树的遍历算法,其中包括递归与非递归算法,在算法中用输出节点数据来代替对节点的操作。 首先给出这样一棵数: 1、前序遍历 所谓前序遍历就是先对节点数据进行处理,然后才对这个节点的左右子树进行处理。对这棵二叉树的前序遍历结果为:ABDCEFG。 递归: void _PreOrder(PNode& pRoot)原创 2017-12-02 15:25:01 · 10647 阅读 · 2 评论 -
递归及递归的简单运用之4种方法解斐波那契数列
什么是递归? 若一个对象部分的包含自己或用它自己给自己定义,那么我们说这个对象是递归的;若一个过程直接或间接的调用自己,那么这个过程是递归的。 递归的思想是把问题分解为规模更小具有与原问题相同解法的子问题,因此可以让我们思考的方式更加简单,程序也更加简练。不过就递归函数而言递归增加了压栈开销,因此空间复杂度比较高。 递归条件: (1)、原创 2017-11-18 14:40:08 · 10779 阅读 · 0 评论 -
栈应用之逆波兰表达式与表达式求值
逆波兰表达式 所谓逆波兰表达式是指先操作数后操作符的后缀表达式,比如中缀表达式3X4的逆波兰为3 4 X,这是简单的逆波兰表达式,稍微复杂一点的比如3X(5+4)-6的逆波兰表达式为3 5 4 + X 6 -,任何算术表达式都可以转换为逆波兰表达式,在这里为了方便就用简单的表达式来举例了。我们可以用程序来完成中缀表达式到逆波兰表达式的转换。 中缀到逆波兰表达式的转换原创 2017-11-18 13:33:33 · 1155 阅读 · 0 评论 -
多行打印二叉树
在此代码中,用到了两个队列,队列1用于进行打印、遍历操作,队列2用于临时保存数据,代码如下:vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int> > v; if(NULL == pRoot) return v; ...原创 2018-06-21 22:15:39 · 163 阅读 · 0 评论