![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 73
数据结构知识点总结及其练习
双鱼211
这个作者很懒,什么都没留下…
展开
-
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
文章目录:1. 插入排序2.希尔排序1. 插入排序步骤:1.从第一个元素开始,该元素可以认为已经被排序2.取下一个元素tem,从已排序的元素序列从后往前扫描3.如果该元素大于tem,则将该元素移到下一位4.重复步骤3,直到找到已排序元素中小于等于tem的元素5.tem插入到该元素的后面,如果已排序所有元素都大于tem,则将tem插入到下标为0的位置6.重复步骤2~5动图演示如下:思路: 在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个原创 2021-07-24 23:27:25 · 566093 阅读 · 221 评论 -
数据结构-堆的实现
堆的实现Heap.h 堆的管理及接口#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef int HPDataType;typedef struct Heap{ HPDataType* a; int size; int capacity;}Heap;//堆的向下调整算法void AdjustDown(HPDataType* a, int n, int root);//堆的向原创 2021-03-18 16:09:03 · 6379 阅读 · 1 评论 -
浅谈topk问题
topk问题从N个数中找出最大(最小)的前k个现实中的场景如:王者荣耀英雄排名(长安区第一百韩信),外面商家店铺排名(长安区冒菜销量第二)思路一:排序(堆排序)时间复杂度为:O(N*log2N)如我们要找出最大的前k个数,我们可以对这N个数进行一个降序排序,然后输出前k个数即可;降序我们就要建小堆,然后将根节点和最后一个叶子节点交换,不把最后一个数看作堆里的数据,然后在进行向下调整;具体分析参考堆排序代码实现//降序void HeapSort(int* a, int n){ //建小堆原创 2021-03-17 15:48:55 · 407 阅读 · 1 评论 -
堆,向下调整算法,向上调整算法,数组建堆算法,堆排序,建堆时间复杂度的推理
目录:1.堆2.堆的实现2.1堆的向下调整算法(建小堆)2.2 堆向下调整算法(建小堆)实现2.3 数组建堆算法(建小堆)2.4 数组建堆算法(建小堆)实现2.5 堆排序(降序)2.6 堆排序(降序)实现2.7 建堆的时间复杂度1.堆大根堆:所有父节点大于等于孩子节点小根堆:所有父节点小于等于孩子节点堆的性质:• 堆中某个节点的值总是不大于或不小于其父节点的值• 堆总是一棵完全二叉树2.堆的实现现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它原创 2021-03-15 21:38:26 · 45445 阅读 · 8 评论 -
树和二叉树的基本概念
目录:一.树二.二叉树1.什么是二叉树2.二叉树的特点3.特殊的二叉树3.1 满二叉树3.2 完全二叉树4.二叉树的性质5.练习一.树树是一种非线性的数据结构,它是由n(n>=0)个有限节点组成的一个具有层次关系的集合,把它叫做树是因为它看起来像一颗倒挂的树,也就是说它是根朝上,叶朝下的如下图所示为一棵普通的树• 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6• 叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点• 非终端节点或分支节原创 2021-03-15 11:21:35 · 333 阅读 · 0 评论 -
LeetCode 622.设计循环队列
题目描述622.设计循环队列-力扣(LeetCode)设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。你的实现应该支持如下操作:• MyCircularQueue(k): 构造器,设置队列长度为 k原创 2021-03-13 17:11:33 · 325 阅读 · 1 评论 -
数据结构--栈和队列(及其实现)
目录:一.栈的介绍1.栈的定义2.压栈和出栈结构示意图3.栈的实现(推荐使用数组)(1)Stack.h 栈的管理及接口(2)Stack.c 栈各个接口功能的实现(3)test.c测试一.栈的介绍1.栈的定义栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则• 压栈:栈的插入操作叫做进栈/入栈,入数据在栈顶。• 出栈:栈的删除操作叫做出栈。出数据也在原创 2021-03-06 12:25:43 · 744 阅读 · 1 评论 -
顺序表(数组)和链表的优缺点对比,举例说明缓存利用率
目录:1.顺序表(数组)缺点:优点:2.双向带头循环链表缺点:优点:3.举例说明缓存利用率1.顺序表(数组)缺点:1.头部或中间插入删除数据需要挪动数据,时间复杂度为O(N)2.空间不够了需要增容,增容有一些消耗。其次增容一般是2倍,那么就有可能存在一定的空间浪费优点:1.相对而言空间利用率更高,不需要额外的空间,占用空间小;链表需要存指针2.物理空间是连续的。a.支持随机访问,可以用下标访问(最大的优势)b.相比链表结构,缓存命中率比较高,访问更高效2.双向带头循环链表缺点:不原创 2021-02-16 11:47:24 · 974 阅读 · 2 评论 -
[数据结构]:双链表(带头双向循环链表)增删查改功能的实现
目录:1.带头双向循环链表2.带头双向循环链表增删查改的实现(1)DoubleList.h 链表各项功能的接口及函数的声明(2)DoubleList.c 各个接口功能的实现(3)test.c 用于测试各项功能1.带头双向循环链表带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了。逻辑结构如下图2.带头双向循环链表增删查改的实现(1)DoubleList.h 链表原创 2021-02-15 14:06:18 · 231 阅读 · 0 评论 -
[数据结构]:单链表(无头+单向+非循环链表)增删查改功能的实现
目录:1.什么是链表2.增删查改功能图解a.尾插b.头插c.尾删e.头删f.在pos位置之后插入xg.删除pos位置之后的值3.单链表的实现(1)SingleList.h 单链表各项功能的接口及函数的声明(2)SingleList.c 各个接口功能的实现(3)test.c 用于测试各项功能(4)测试结果1.什么是链表链表:是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的实际中链表的结构非常多样,有以下情况组合起来的8种链表结构a.单向,双向b.带头原创 2021-02-14 17:22:35 · 292 阅读 · 0 评论 -
[数据结构_初阶] 线性表 顺序表及其实现
目录:1.什么是线性表2.什么是顺序表3.顺序表的实现(1)SeqList.h 顺序表各项功能的接口及函数的声明(2)SeqList.c 各个接口功能的实现(3)test.c 用于测试各项功能1.什么是线性表1.线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…2.线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形原创 2021-01-26 14:30:24 · 503 阅读 · 2 评论 -
[数据结构_初阶] 时间复杂度,空间复杂度
目录:1.算法效率2.时间复杂度a.大O的渐进表示法3.时间复杂度例题(1)计算BinarySearch的时间复杂度?4.空间复杂度(1)例一:计算BubbleSort的空间复杂度?(2)例二:计算Fibonacci的空间复杂度?(3)例三:计算阶乘递归Factorial的空间复杂度?1.算法效率算法效率分为两种:一种是时间效率又称时间复杂度,主要衡量一个算法的运行速度;一种是空间效率又称空间复杂度,主要衡量一个算法所需要的空间;这两种复杂度都采用大O的渐进表示法表示。随着计算机行业的迅速发展,计算机原创 2021-01-25 15:52:00 · 429 阅读 · 2 评论