![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
hurricane&&storming
Not being impetuous
展开
-
二分排序法
二分排序法运行结果:思想:1, 逐渐扩大排好序区间,用待排元素插入到排好序的序列中2,查找待插入位置时用二分查找法#include<iostream>// 折半插入排序void binarySort(int a[], int n) { int i, j, low, mid, high; for (i = 2; i < n; ++i) { a[0] = a[i]; // 待排元素,a[0]用来存储每次待排的元素,不参与整体排序 low = 1; hi原创 2021-12-20 01:36:58 · 394 阅读 · 0 评论 -
用前序和中序遍历序列构造二叉树
用前序和中序遍历序列构造二叉树生成如下图这样一棵树,简单容易想遍历序列它的先序:1 2 4 3它的中序:4 2 1 3它的后序:4 2 3 1构造思想:先序第一个元素即为根结点的值 1,在中序中找到 1,由 1 将中序序列分成两个子序列,左边子序列构成左子树,右边子序列构成右子树,再对左、右两个子序列用同样的方法处理,知道所处理的子序列只剩下一个元素时二叉树构造结束。运行结果:源码#include<iostream>// 二叉链表存储树typedef原创 2021-12-09 01:35:46 · 665 阅读 · 0 评论 -
图(邻接矩阵、表)的创建(怎么生成)过程,然后学会遍历,掌握这两个基本操作,才能更好地深究图后面的算法那.
知道图的创建过程、然后学会遍历,掌握这两个基本操作,才能更好地深究有关图后面的算法那首先要明白他们的基本思想创建图(如果是邻接矩阵表示,比较容易,直接定义一个二维数组就行了)创建邻接表(图)的基本思想:确定顶点数和边数初始化每个顶点的位置(也就是每个顶点在邻接表中的位置)连接有边的顶点(无向图双向连接,有向图只连单边),并赋予权值深度优先搜索的基本思想:任取一个顶点,访问之,然后检查这个顶点的所有邻接顶点,递归访问其中未被访问过的顶点广度优先搜索的基本思想:任取图中一原创 2021-11-04 19:26:57 · 423 阅读 · 0 评论 -
【宝藏】二叉树的非递归遍历 | 先序 | 中序 | 后序 | 层次
二叉树的非递归遍历运行结果(采用二叉排序法构建二叉树):代码如下:#include<iostream>// 定义二叉树结点类型,以二叉链表作为存储二叉树的数据结构typedef struct BTNode { int data; struct BTNode* lchild; struct BTNode* rchild; // 默认构造 BTNode() :data(0), lchild(0), rchild(0) {} // 带参构造函数 BTNode(int原创 2021-09-24 01:02:33 · 155 阅读 · 0 评论 -
【考题】合并两个有序表为一个有序表
合并两个有序表为一个有序表合并后为一个有序表思路都在代码注释里了。#include<iostream>// merge 归并,将两个有序表 a[], b[] 合并为一个有序表int* temp = new int[20](); // 动态开辟一个大小为 20 的空间并初始化这 20 个单元值为 0int* merge(int a[], int b[], int m, int n) { size_t i = 0, j = 0, k = 0; // 下面会用到的数组变量原创 2021-09-20 20:34:18 · 861 阅读 · 0 评论 -
【宝藏归并排序算法代码】归并排序算法 | 详细实现
归并排序算法想写的都放在代码注释里了#include<iostream>int* p = new int[20](); // 动态开辟一个大小为 20 的空间并初始化这 20 个单元值为 0 // A[] 表示 [low...mid] and [mid + 1...high] 都是有序的void merge(int A[], int low, int mid, int high) { // 将两片各自有序的表合并为一个有序表 size_t i = 0, j = 0, k原创 2021-09-20 20:19:17 · 95 阅读 · 0 评论 -
二叉树 | 前、中、后序递归遍历及层次遍历
二叉树的前、中、后序递归遍历及层次遍历运行结果二叉树采用二叉排序树生成法,所以中序输出递增序列想描述的都在代码里了,这些都比较简单,直接看代码里的注释吧。#include<iostream>// 定义二叉树结点类型,以二叉链表作为存储二叉树的数据结构typedef struct BTNode { int data; struct BTNode* lchild; struct BTNode* rchild; // 默认构造 BTNode() :data(0),原创 2021-09-19 23:19:38 · 191 阅读 · 0 评论 -
【宝藏】一篇博客代码 + 注释让你搞懂线索二叉树
线索二叉树一. 线索二叉树的创建、遍历二. 前、后序递归线索化二叉树(补充)一. 线索二叉树的创建、遍历运行结果代码如下,注释为王#include<iostream>// 线索二叉树结点定义typedef struct TBTNode { int data; // 值域 int ltag, rtag; // 左右线索标记 struct TBTNode* lchild; // 左指针 struct TBTNode* rchild; // 右指针 // 默认构原创 2021-09-19 21:54:01 · 97 阅读 · 0 评论 -
二叉排序(搜索)树 | BST | 插入 | 创建 | 查找 | 遍历
二叉排序(搜索)树 | BST | 插入 | 创建 | 查找 | 遍历运行结果注释为王,请看代码:#include<iostream>// 定义二叉树结点类型,以二叉链表作为存储二叉树的数据结构typedef struct BTNode { int data; struct BTNode* lchild; struct BTNode* rchild; // 默认构造 BTNode() :data(0), lchild(0), rchild(0) {} // 带参原创 2021-09-19 16:47:00 · 132 阅读 · 0 评论 -
C++ | 快速排序
C++ 快速排序通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。代码详情#include<iostream>// 对数组从下标 low 到 high 进行排序void Qsort(int a[], int low, int high) { if (low >= high) return; int temp = 0;原创 2021-09-18 20:27:16 · 83 阅读 · 0 评论 -
kmp 算法的一种代码实现
kmp 算法的一种代码实现本文档仅提供代码实现(刚好 100 行),有注释,但由于 kmp 算法理解的困难性,深入理解还需参考一些其他资料。#include<iostream>//简单匹配size_t index(std::string&, std::string&);// next[]void get_next(std::string&, int next[]);// 优化后 nextval[]void get_nextval(std::st原创 2021-09-05 16:55:55 · 163 阅读 · 0 评论 -
(面试常考数据结构灵活应用)用两个栈实现一个入队功能
用两个栈实现一个入队功能// 定义结点typedef struct node{ int data; node* next;}node, * LinkStack;// 创建空栈LinkStack CreateNULLStack(LinkStack& S){ // S = (LinkStack)malloc(sizeof(node)); // 申请新结点 S = new node(); if (NULL == S) { printf("Fail to malloc a n原创 2021-07-22 16:27:51 · 79 阅读 · 0 评论 -
主要是为了 栈和队列的应用 熟悉这两种数据结构 才写了个小程序(C++ 小小米计算器)
小小米计算器我始终觉得,写程序,注释为王在追求代码质量的路上我希望越做越好,代码越简单,程序越稳定,bug 也就更不容易出现试运行 .exe 文件 → counter她的结构然后他运行后的主要界面,有两种模式模式 1模式 2接下来还得看源程序咯,就这 “破” 玩意儿,我调了好几晚,最后妥协做了个只能进行一位四则运算的迷你计算器。主函数/** * 作者 :hurricane&&storming** 日期 :2021.5.28**/#incl原创 2021-05-28 23:13:47 · 181 阅读 · 0 评论 -
顺序表逆置问题,包括全逆置、区间逆置、最前(后)逆置和用逆置实现循环移位
线性表逆置逆置问题无非就是选取某些元素交换本文先考虑全逆置和区间逆置然后引出最前面和最后面逆置最后用前面的思路求解循环移动问题原创 2021-05-14 10:22:06 · 269 阅读 · 0 评论 -
C++ 实现电话薄(链表头插法实现添加联系人),简单地描写,主要是注重代码质量,看懂后可以很容易在上面添加其他功能并便于维护
C++ 实现电话薄(链表头插法实现添加联系人)主要实现了四个函数。原创 2021-04-28 19:26:39 · 758 阅读 · 0 评论 -
浅谈 二叉搜索树迭代器 问题
二叉搜索树迭代器实现一个二叉搜索树迭代器类 BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器:BSTIterator (TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false 。int next()将指针向右移动,原创 2021-03-28 15:06:36 · 126 阅读 · 0 评论 -
浅谈 二叉树中序遍历 问题
二叉树中序遍历给定一个二叉树的根节点 root ,返回它的 中序 遍历。思路:采用自然的递归方式是最简洁的方法,因为我们知道递归、递归就是顺向遍历,然后逆向返回结果的过程,所以很容易的将中序遍历结果存入数组。下面也给出迭代法以及Morris 中序遍历法。 // 递归/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tree原创 2021-03-28 14:30:03 · 205 阅读 · 0 评论 -
常用高阶排序算法总结(归并、快速、希尔排序)
一、归并排序归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。时间复杂度: O(nlogn)空间复杂度:O(n)稳定二、快速排序它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此原创 2021-03-24 17:29:16 · 360 阅读 · 0 评论 -
常用中阶排序算法总结(桶、基数、堆排序)
文章导航一、桶排序二、基数排序三、堆排序一、桶排序桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。#include<iterator>#include<iostre原创 2021-03-24 17:04:46 · 210 阅读 · 0 评论 -
常用简单排序算法总结(冒泡、插入、选择排序)
文章导航一、冒泡排序二、一、冒泡排序void bubblesort(const int a[], const int& n){ bool sorted = false; // 整体排序标志,这是本算法的有力手段 while(!sorted){ sorted = true; // 假定已经排序 for(int i = 1; i < n; ++i){ // 自左向右逐对检查当前范围 a[0, n)内的各相邻元素 if(a[i - 1] > a[i]){ // 逆序原创 2021-03-24 16:48:18 · 327 阅读 · 1 评论 -
从倒置 reverse 和斐波那契数列 Fibonacci 数浅谈尾递归及其消除
尾递归及其消除先来看看递归倒置数组算法// 调用形式 reverse(a, 0, n -1)void reverse(int* p, const int& l, const int& r) { if (l < r) { std::swap(p[l], p[r]); // 交换 reverse(p, l + 1, r - 1); // 递归倒置p(l, r) } // 隐含了两种递归基}由于上述算法属于尾递归,所以我们可以用迭代法对其进行消除// 调用形式 r原创 2020-11-19 16:57:33 · 232 阅读 · 0 评论 -
二叉树(BinTree)
BinTree树是半线性结构,分层结构,具有无环性二叉树的身影几乎出现在所有应用领域中沿每个节点到根的唯一通路所经过的边的数目,称作节点的深度。每个节点的孩子总数,称作其节点的度数或度。树中所有节点的深度的最大值称作该树的高度。仅含单个节点的树高度为 0,空树高度为 -1。不含一度节点的二叉树称作真二叉树。通讯在开始通讯之前,双方应已经以某种方式,就编码规则达成过共同的约定或协议。二进制编码:PFC 编码 → 前缀无歧义编码:任何两个原始字符所对应的二进制编码串,相互都不原创 2021-01-28 21:39:15 · 1073 阅读 · 0 评论 -
栈与队列
栈与队列栈后进先出结构,向量(Vector)的派生类。栈 ADT 支持的操作接口操作接口功能size()返回栈规模empty()判断栈是否为空push(e)将 e 插至栈顶pop()删除栈顶对象top()引用栈顶对象Stack 模板类#include "../Vector/Vector.h" //以向量为基类,派生出栈模板类template <typename T> class Stack: public Vector<原创 2021-01-25 23:04:56 · 118 阅读 · 0 评论 -
列表(ListNode)
ListNode列表节点 ADT 支持的操作接口操作接口功能data()当前节点所存数据对象pred()当前节点前驱节点的位置succ()当前节点后继节点的位置insertAsPred(e)插入前驱节点,存入被引用对象 e,返回新节点位置insertAsSucc(e)插入后继节点,存入被引用对象 e,返回新节点的位置列表 ADT 支持的操作接口操作接口功能适用对象size()返回节点总数列表first()、la原创 2021-01-24 00:18:56 · 3351 阅读 · 0 评论 -
向量(vector)
vector接口操作接口功能适用对象size()返回元素总数向量insert(r, e)e 作为秩为 r 的元素插入,后继元素依次后移向量remove(r)删除秩为 r 的元素,返回该元素中原存放的对象向量disordered()判断所有元素是否已按非降序排列(升序返回 0)向量sort()使之升序排列向量find(e)查找等于 e 且秩最大的元素的秩向量search(e)查找目标元素 e,返回不大于 e 且秩最大的元素原创 2021-01-21 16:30:39 · 222 阅读 · 0 评论 -
初识递归思想之美,一场入坑的完美盛筵_冒泡排序加强版,递归最大数、最小数及数组元素和
冒泡排序、递归算法首先给出一种让你可能耳目一新的冒泡排序算法void bubblesort(int a[], int& n){ bool sorted = false; // 整体排序标志,这是本算法的有力手段 while(!sorted){ sorted = true; // 假定已经排序 for(int i = 1; i < n; ++i){ // 自左向右逐对检查当前范围 a[0, n)内的各相邻元素 if(a[i - 1] > a[i]){ // 逆序原创 2020-11-18 21:59:45 · 235 阅读 · 2 评论 -
STL 容器----vector、deque、list、set、map
文章目录1.vector2.deque3.list4.set5.map6.list 的查找、插入、排序、反转1.vector实现可变容量数组#include<vector>#include<iostream>int main() { std::vector<double> vec; for (auto i = 0; i < 6; ++i) { vec.push_back(i); } // for 循环输出向量元素 for (auto i :原创 2020-11-30 22:23:40 · 216 阅读 · 0 评论