学习篇---数据结构
记录常见的数据结构和算法
程序猿的温柔香
一个懂技术,也懂浪漫的程序猿
展开
-
红黑树和 AVL 树的旋转调整以及性能分析
平衡搜索树性能分析,以及插入和删除的旋转方法红黑树和AVL树的区别,红黑树性能为什么比AVL树高原创 2019-08-12 15:58:49 · 4409 阅读 · 1 评论 -
手写非递归遍历二叉树、前序、中序、后序
前序、中序、后序遍历二叉树原创 2020-08-19 15:16:55 · 283 阅读 · 0 评论 -
冒泡法排序
用c语言对一串数字进行排序,该方法是冒泡法。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>void Swap(int* x, int* y){ int tmp = *x; *x = *y; *y = tmp;}//void Bubb...原创 2019-01-21 22:22:14 · 393 阅读 · 0 评论 -
选择排序,堆排序
文章目录一、直接选择排序算法1.升序的选择排序~2.降序的选择排序~3.选择排序的优化二、堆排序一、直接选择排序算法这种算法比较好理解:先整体遍历一遍,找到最大元素的下标,然后把下标对应的元素与最后的位置元素交换位置,这是第一套遍历;然后把再进行一次遍历,找出最大的元素(最后一个不找),找到后与最后一个元素的前一个位置的元素交换;直到剩下最后一个元素,就排好了~~!1.升序的选择排序~vo...原创 2019-04-19 22:12:11 · 146 阅读 · 0 评论 -
快速排序算法,挖坑版, hoare版,快慢指针版
文章目录常见的交换排序分为:(1)冒泡法好~ ~ ~ ~ 接下来要进入正题啦 ! ! !快速排序0.这个是快速排序大框架方法一:放法二:方法三:常见的交换排序分为:(1)冒泡法这个比较简单,下面写一个稍微优化一点的冒泡排序void BubbleSort2(int *array, int size){ for (int i = 0; i < size - 1; ++i) {...原创 2019-04-22 17:11:19 · 341 阅读 · 0 评论 -
归并排序算法
归并排序大致思路:归并排序首先是将一个数列分为2个或多个数列,一直到每个数列只剩下一个元素,然后将每个数列进行归并;官方解释:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称...原创 2019-04-23 14:49:09 · 130 阅读 · 0 评论 -
插入排序,希尔排序
文章目录常见的排序方法:1.插入排序 2.选择排序 3.交换排序 4.归并排序头文件 .h主函数 -- 测试总结1.这个快速插入法的时间复杂度和空间复杂度?2.优点与缺点希尔排序法常见的排序方法:1.插入排序 2.选择排序 3.交换排序 4.归并排序这篇文章总结的是:插入排序中的(1)直接插入排序和(2)希尔排序插入排序的思想就和打扑克牌一样,摸到哪张牌就把那张牌放到恰到的...原创 2019-04-17 12:36:11 · 120 阅读 · 0 评论 -
计数排序算法
计数排序这个排序算法和其他排序有一个不一样的地方就是:它是非比较排序,全程没有进行比较的语句;大致思路为4步。遍历整个数列,选择出最大值和最小值申请一个辅助空间并置空,空间大小由数据的范围决定统计每个数字出现的次数最后把数字一个一个的赋值到原来的数组里面void CountSort(int *array, int size){ //选择最小的和最大的数字·O(N) N代表的是数...原创 2019-04-23 14:27:26 · 373 阅读 · 0 评论 -
LRU 算法底层数据结构实现原理
数据结构:哈希链表原创 2020-05-14 22:15:58 · 1946 阅读 · 0 评论 -
STL 重要的算法(最常见)
STL中算法大致分为四类:非可变序列算法:指 不直接修改其所操作的容器内容的算法。可变序列算法:指 可以修改它们所操作的容器内容的算法。排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。数值算法:对容器内容进行数值计算。查找算法find: 利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的一个InputIte...原创 2019-08-22 16:06:55 · 522 阅读 · 0 评论 -
广度优先搜索(BFS)与深度优先搜索(DFS)的对比及优缺点
广度优先搜索(BFS)与深度优先搜索(DFS)的对比及优缺点深搜,顾名思义,是深入其中、直取结果的一种搜索方法如果深搜是一个人,那么他的性格一定倔得像头牛!他从一点出发去旅游,只朝着一个方向走,除非路断了,他绝不改变方向!除非四个方向全都不通或遇到终点,他绝不后退一步!因此,他的姐姐广搜总是嘲笑他,说他是个一根筋、不撞南墙不回头的家伙。深搜很讨厌他姐姐的嘲笑,但又不想跟自己的亲姐姐闹矛盾,于...转载 2020-02-20 21:19:32 · 20354 阅读 · 3 评论 -
C++11 STL 关联式容器,map,set ,multimap,multiset ,unordered_map,unordered_set;
本节目标1.熟练掌握map、multimap、set、multiset的接口以及使用2. 熟悉关联式容器的底层数据结构3. 实现二叉搜索树、AVL树、红黑树4. 模式实现 map、set关联式容器 VS 序列式容器序列式:vector、list、deque、forward_list(C++11),他们的底层结构都是 线性序列的数据结构 ,里面存储的是元素本身关联式:里面存储的是 &...原创 2019-08-27 20:38:10 · 299 阅读 · 0 评论 -
C++11 STL 序列式容器 vector、list、string、deque...
底层结构是动态数组,在堆中分配内存,元素连续存放,有保留内存,如果减少大小后,内存也不会释放;如果新值大于当前大小时才会重新分配内存。vector 具有以下特性:O(1)时间的快速访问顺序存储,所以插入到非尾结点位置所需时间复杂度为O(n),删除也一样;扩容规则: 当我们新建一个 vector 的时候,会首先分配给他一片连续的内存空间,如std::vector vec,当通过push...原创 2019-08-23 15:33:12 · 462 阅读 · 0 评论 -
序列式容器 -- list 底层结构
list 的底层结构首先 list 是可以随意插入和删除的序列式容器,迭代器可以双向迭代,它的底层结构是 双向链表 ,在节点中通过指针指向前一个节点和后一个节点【补充】list 和 forward_list 不同之处是,forward_list 可以向前迭代,已让他更简单高效优、缺点优点:相比于 vector,array,deque 在任意位置进行插入和删除更容易缺点:不支持任意位置的随...原创 2019-08-24 15:03:37 · 374 阅读 · 0 评论 -
栈和队列的经典例题(括号匹配,用栈实现队列,用队列实现栈,设计循环队列)
栈和队列的基础接口实现链接:https://blog.csdn.net/qq_43763344/article/details/89386829.============================================================头文件:#include <iostream>#include <stdio.h>#include...原创 2019-04-19 10:25:00 · 536 阅读 · 0 评论 -
线性表--顺序表的增、删、查、改
线性表—>顺序表1实现顺序表的增、删、查、改线性表分为顺序表和链表,这篇首先写的是顺序表的一些最最最最基本的操作~~增、删、查、改文章目录线性表--->顺序表10.包含头文件创建、销毁 --顺序表1.增-头插-尾插-指定位置的插入内存扩容2.删-头删-尾删-指定位置的删除3.查找、修改某一个元素删除特定的元素0.包含头文件#include <stdio.h>#i...原创 2019-03-22 14:35:03 · 339 阅读 · 0 评论 -
线性表--链表增、删、查、改
线性表–链表增、删、查、改链式结构的基本插入,删除,修改,改动结点的代码是最基本的代码目录线性表--链表增、删、查、改0.包含头文件和结构体初始化/销毁链表1.头插、尾插、指定位置插2.头删、尾删、指定位置删除结点3.指定结点在链表里查找有没有4.修改链表--反转方法一:旧链表头删,新链表头插方法二:定义三个指针5.删除v所对应的点删除v对应的所有结点0.包含头文件和结构体#include...原创 2019-03-22 21:32:39 · 541 阅读 · 0 评论 -
容器适配器 stack、queue、priority_queue
底层结构和原理容器 deque 和 vector 非常相似,属于序列式容器。都是采用动态数组来管理元素,提供随机存取,并且有着和vector一样的接口。不同的是deque具有首尾两端进行快速插入、删除的能力。双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”的假象,落在了deque的迭代器身上deque 和 vector 的区别?deque提供了一些与vector相似...原创 2019-12-21 23:05:18 · 301 阅读 · 0 评论 -
链表面试题1
链表面试题目录链表面试题1.删除链表中等于给定值 val 的所有节点(递归实现)2.反转一个单链表。方法一:定义三个指针方法二:定义一个新的空链表(进行尾插)方法三:递归实现3.给定一个带有头结点 head 的非空单链表,返回链表的中间结点。方法一:快慢指针【不起眼的坑】方法二:计数 循环1.删除链表中等于给定值 val 的所有节点(递归实现)输入: 1->2->6-&g...原创 2019-03-31 22:32:35 · 154 阅读 · 0 评论 -
链表面试题2
链表经典题6.以给定值x为基准将链表分割成两部分,函数实现构建结点函数测试7.请删除该链表中重复的结点,迭代实现删除递归实现删除8.判断链表是否为回文结构结构体定义函数主体实现方法一:指针链表的结合方法二:方法三:利用栈的结构9.输入两个链表,找出它们的第一个公共结点方法一:遍历方法二:链接指针6.以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前给定一个链表的头...原创 2019-04-08 18:33:25 · 403 阅读 · 0 评论 -
用C++类实现 双向非循环带头结点的链表
双向非循环带头结点的链表图好像有点丑~~下列是相关操作的代码(C++ 类封装)#pragma once#include <iostream>#include <stdlib.h>#include <assert.h>using namespace std;//对一个结点进行封装class Node {public: Node* _nex...原创 2019-06-24 11:27:15 · 282 阅读 · 0 评论 -
数据结构---堆(基础)
1. 熟悉堆的概念以及特性堆的概念:堆可以看做是一颗树的数组对象---完全二叉树完全二叉树:在按层序遍历时遇到的第一个NULL指针就作为结尾的二叉树堆的特性:1.根结点最大的值称之为大堆,根结点最小的堆称小堆; 2.堆是非线性结构,相当于一维数组,有两个直接后继; 3.从根结点到任意结点路径都是有序的; 注意:堆和堆内存是两个完全不同的概念,堆内存是存储...原创 2019-04-14 23:10:23 · 1703 阅读 · 0 评论 -
用C/C++实现栈和队列的封装
一、 熟悉栈的概念以及特性(0)它是一种运算符受限的线性表,因为(2)(1)像水桶呈东西一样,先进后出,后进先出 (2)栈顶是可以操作的一端,栈底不可操作!push压入,top弹出栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针二、 数据结构中栈与程序中栈有什么不同?1.数据结构的栈:管理数据的一种手段或者是方法!可以用来存放数据和地址;2.内存中的栈:是确切存在的物理结...原创 2019-04-18 20:04:37 · 1127 阅读 · 0 评论 -
顺序表基本操作实现(详细)
顺序表分为1.静态顺序表 2.动态顺序表顺序表的目录1.顺序表的概念2. 熟悉顺序表的分类?3.熟悉顺序表的优缺点4.动态顺序表的基本操作4.0包含头文件和结构体4.1初始化,销毁,扩容4.2尾插,尾删,头插,头删4.3任意位置的插入和删除4.4移除指定值的元素4.5其它简单操作5.测试函数1.顺序表的概念(1)顺序结构-----------将表中元素一个一个的存入一组连续的存储单元中(2...原创 2019-04-12 14:03:41 · 2554 阅读 · 0 评论