![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 73
It‘s so simple
这个作者很懒,什么都没留下…
展开
-
排序算法:选择排序和冒泡排序
目录1. 选择排序2. 冒泡排序1. 选择排序void SelectSort(vector<int>& iv){ int begin = 0; int end = iv.size() - 1; while (begin <= end) { int maxi = begin; int mini = end; for (int i = begin; i <= end; ++i) { if (iv[i] > iv[maxi])原创 2021-09-08 09:31:02 · 225 阅读 · 0 评论 -
排序算法:直接插入排序、归并排序(递归与非递归实现)
目录1. 直接插入排序2.归并排序2.1 递归2.2 非递归1. 直接插入排序void InsertSort(vector<int>& iv){ for (int i = 0; i < iv.size() - 1; ++i) { int end = i; int tmp = iv[end + 1]; while (end >= 0 && iv[end] > tmp) { iv[end + 1] = iv[end];原创 2021-09-07 17:09:07 · 505 阅读 · 0 评论 -
排序算法:堆排,快排的实现(快排的三种实现方法以及快排的优化)
目录1. 堆排2. 快排2.1 双指针法2.2 挖坑法2.3 前后指针法2.4 非递归2.5 快排的优化1. 堆排升序建大堆,逆序建小堆,先建堆,堆建好之后,将堆中最后一个元素和第一元素互换,然后执行向下调整算法进行调堆,最终实现相应的顺序。void AdjustDown(vector<int>& iv, int pos,int n){ int parent = pos; int child = pos * 2 + 1; while (child < n) {原创 2021-09-05 10:16:25 · 413 阅读 · 0 评论 -
数据结构:二叉树的实现(二叉树接口的超详细C语言实现)
文章目录1. 概念1.1 二叉树的链式结构2. 接口实现2.1 通过前序遍历的数组构建二叉树2.2 二叉树销毁2.3 二叉树节点个数2.4 二叉树叶子节点个数2.5 二叉树第k层节点个数2.6 二叉树查找值为x的节点2.7 二叉树前序遍历2.8 二叉树中序遍历2.9 二叉树后序遍历2.10 层序遍历2.11 判断二叉树是否是完全二叉树1. 概念关于二叉树的详细概念,大家可以看我之前写的二叉树(二叉树的概念及性质证明),本节就不再做过多描述。但有一点要说明的是在二叉树这一数据结构面前,单独一个二叉树的原创 2021-03-17 12:11:00 · 579 阅读 · 3 评论 -
数据结构:堆的实现(堆的接口超详细C语言实现)
文章目录1. 概念1.1 堆的性质1.2 堆的动态结构2. 具体的接口实现2.1 堆的构建2.2 堆的销毁2.3 堆的插入2.4 堆的删除2.5 取堆顶的数据2.6 堆的数据个数2.7 堆的判空2.8 对数组进行堆排序2.9 向下调整算法2.10 向上调整算法2.11 TopK问题:找出N个数里面最大/最小的前K个问题。3. 牛刀小试1. 概念堆是一种完全二叉树,现实中通常使用顺序结构的数组来存储堆,此处的堆是一种数据结构(完全二叉树),而不是虚拟进程空间中的那个堆(是操作系统用来管理内存的一个区域原创 2021-03-17 11:11:16 · 469 阅读 · 0 评论 -
经典面试题:TopK问题(一种思路,两种优化,最终优化到极致)
文章目录一、问题描述二、解决思路及优化2.1 排序(快速排序或堆排序)2.2 优化2.2.1 第一次优化2.2.2 第二次优化一、问题描述在面试中面试官经常会问这样一个问题:现在有N个数,请找出最大的或最小的前k个数,这就是经典的TopK问题,这种问题在实际的业务非常的常见,比如微博的热搜排名,抖音的每日热榜排名等等都是属于这种Top问题。二、解决思路及优化2.1 排序(快速排序或堆排序)当我们看到这种题目的时候,大多第一反应都是排序,将这N个数按升序或降序的方式排好序,然后再取前k个最小或最大原创 2021-03-16 17:10:21 · 2551 阅读 · 6 评论 -
面试考点--堆(向下调整算法,向上调整算法,建堆,堆排序)以及堆排序、建堆的时间复杂度分析(图文并茂)
堆堆是一种完全二叉树,现实中通常使用顺序结构的数组来存储堆,此处的堆是一种数据结构(完全二叉树),而不是虚拟进程空间中的那个堆(是操作系统用来管理内存的一个区域分段 )原创 2021-03-12 16:39:48 · 2036 阅读 · 6 评论 -
二叉树(二叉树的概念及性质证明)
树树是一种非线性的数据结构,它是由n(n >= 0)个有限结点组成的一个具有层次关系的集合。树有一个特殊的结点,称为根节点,根节点是没有前驱节点的,并且除根节点外,其余节点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继。因此,树是递归定义的。即任何一棵树都可以被分解成为根+子树的形式,并且子树可以再被分解其相应的根和子树,直至不可分割为止。递原创 2021-03-10 16:25:59 · 1472 阅读 · 0 评论 -
Leetcode-622:设计循环队列
题目描述622.设计循环队列设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。你的实现应该支持如下操作:MyCircularQueue(k): 构造器,设置队列长度为 k 。Front: 从队首获取原创 2021-03-10 13:39:06 · 95 阅读 · 0 评论 -
队列的实现(具体接口实现)
队列队列:只允许在一端进行插入数据操作,在另一端进行删除数据的特殊线性表,队列具有先进先出的FIFO(First In First Out),同栈正好相反入队:在队尾进行插入操作即为入队出队:在队头进行删除操作即为出队队列也可以用数组和链表实现,但是使用链表的结构更优,因为如果使用数组的结构,出队时会在数组的头上出数据,出完数据后还必须处理剩下的数据,效率会比较低下,而链表在出完数据后,直接更换头结点并释放原来结点即可,相比于数组要更为适合实现队列一些。队列的链式结构typedef in原创 2021-03-09 14:45:52 · 457 阅读 · 0 评论 -
栈的实现(具体的接口实现)
栈栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素的操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,栈中的数据元素遵守后进先出LIFO(Last In First out)的原则压栈:栈的插入操作叫做压栈,也可称为进栈或入栈,在栈顶入数据。出栈:栈的删除操作叫出栈,出数据也在栈顶。栈的实现一般可以使用数组或链表实现,但两者相对而言数组的结构更优一些,因为数组在尾上插入数据的时候是直接用下标插入,而链表则需要找到它的尾指针,然后再进行插入(双向链表除外,这里的链表通常都原创 2021-03-09 14:16:04 · 301 阅读 · 0 评论 -
双向链表(具体的接口实现)
双向链表双向链表,即双向带头循环链表,结构最复杂,一般用在单独存储数据。它有两个指针,一个指向前驱结点的前驱指针,一个指向后置结点的后置指针,并且还保存着相应的数据。逻辑结构如图所示:双向链表的声明typedef int LTDataType;typedef struct ListNode{ LTDataType data; struct ListNode* next; struct ListNode* prev;}ListNode;双向链表的接口实现1. ListNode*原创 2021-02-06 17:28:54 · 487 阅读 · 0 评论 -
单链表(具体接口实现)
链表链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表的分类链表有8种结构1.单向、双向2. 带头、不带头3. 循环、非循环本节我们主要介绍单链表(即单向不带头非循环链表)的接口实现单链表的声明typedef int SLTDateType;typedef struct SListNode{ SLTDateType data; struct SListNode* next;}SListNode;具体的逻辑结构如图原创 2021-02-06 14:51:36 · 186 阅读 · 0 评论 -
顺序表(具体的接口实现)
线性表线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。顺序表顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表一般又可分为静态顺序表和动态顺序表。静态顺序表#defin原创 2021-02-06 10:24:59 · 153 阅读 · 0 评论 -
时间复杂度和空间复杂度
时间复杂度概念在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。大O表示法我们采用大O的渐进表示法来表示算法的时间复杂度,一个程序在运行时,根据算法、测试用例的不同,大概分为最好、平均和最坏等三种情况,而我们时间复杂度则计算的是它的最坏的情况,大O符号。即是用于描述函数渐进行为的一个数学符号,实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执原创 2021-01-27 12:14:56 · 196 阅读 · 0 评论