![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构初阶
文章平均质量分 74
盘大man
这个作者很懒,什么都没留下…
展开
-
排序算法复杂度及稳定性分析
如果排序前后它们的相对位置不发生变化,则称该排序算法是稳定的;否则称该排序算法是不稳定的。排序算法的稳定性指的是对于具有相同关键字的元素,在排序前后它们的相对位置是否发生变化。原创 2023-05-31 13:08:01 · 40 阅读 · 0 评论 -
排序----- 计数排序,基数排序
计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。时间复杂度:O(MAX(N,range)),range表示范围(Max函数:取两者中大的那个数)空间复杂度:O(range),range表示范围稳定性:稳定时间复杂度:基数排序的时间复杂度为O(d(N+k))其中d是元素的位数,N是元素个数,k是基数。当d较小,k不是很大时,基数排序的时间复杂度可以达到线性级别,比如在对电话号码进行排序时。O(k+n),N是元素个数,k是基数稳定性:稳定计数排序是非比较排序,需要移动数据。原创 2023-05-30 21:52:53 · 96 阅读 · 0 评论 -
排序-----归并排序,外排序
归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。时间复杂度:O(N*logN)空间复杂度:O(N)稳定性:稳定将两个有序的数组进行归并,归并后还有序。对于无序的数组,可先用分治的思想,将其分为不可再分的子区间后,再进行归并,从而达到整体有序。归并的非递归可以用栈或者队列来实现,实现方法于快排的非递归法差不多,都是用栈或者队列保存子区间下标,但也可以不用栈和队列,可直接用gap来表示每次递归的间距,通过循环使gap变化,也能产生同样的效果。原创 2023-05-30 15:46:26 · 78 阅读 · 0 评论 -
排序-----冒泡排序,快速排序
冒泡排序是一种非常容易理解的排序时间复杂度:O(N^2) 最好:O(N)空间复杂度:O(1)稳定性:稳定快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序时间复杂度:O(N*logN)空间复杂度:O(logN)稳定性:不稳定快速排序这一节知识点很多,要求掌握单趟快排的前后指针法,其他两种方法也要了解。快排的非递归也要掌握!快排的基本思想:选一个最左边或最右边的数做key,然后通过指针去将比key大的数,比key小的数分别放在key的两边,用到了分治的思想。原创 2023-05-29 22:00:04 · 28 阅读 · 0 评论 -
排序-----选择排序,堆排序
直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用时间复杂度:O(N^2) (最好和最坏都是O(N^2)空间复杂度:O(1)稳定性:不稳定堆排序使用堆来选数,效率就高了很多。时间复杂度:O(N*logN)空间复杂度:O(1)稳定性:不稳定选择型的排序中,两个排序都比较好理解,选择排序的效率极其低,堆排序好很多,使用堆排序时,一定要先对待排序数组建堆,并且用向下调整建堆,向下调整建堆相比于向上调整建堆快一点,建好堆后,需用向下调整进行排序,这节内容的核心是堆的两种调整算法。原创 2023-05-29 22:05:31 · 38 阅读 · 0 评论 -
排序-----插入排序,希尔排序
时间复杂度:O(N^2)最好:O(N) ------顺序有序或者接近有序最坏:O(N^2) ------逆序空间复杂度:O(1)稳定性:稳定希尔排序是对直接插入排序的优化。**当gap > 1时都是预排序,目的是让数组更接近于有序。**当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定。时间复杂度。原创 2023-05-29 15:25:57 · 107 阅读 · 6 评论 -
二叉树OJ练习题
这些题难度都是简单,但是要自己单独做出来还是会有困难的,对二叉树的理解没有那么深刻,递归用的也是不熟悉。做过一遍后,再回过头来看一遍,发现逻辑还是不难的,核心还是要掌握递归的分治思想。原创 2023-05-21 10:00:00 · 50 阅读 · 0 评论 -
链式二叉树-----递归实现
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的主要思考方式在于:把大事化小。原创 2023-05-20 10:00:00 · 268 阅读 · 0 评论 -
二叉树的遍历----递归实现
二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。二叉树的深度优先遍历主要用到了递归的思想,广度优先遍历用到了队列。递归思想的核心是把大事化小,还有就是递归的限制条件,这两点是很重要的。层序遍历考验了我们对队列的掌握程度。原创 2023-05-19 12:22:58 · 143 阅读 · 0 评论 -
堆,Top-K, 堆排序 ---详解
这章的干货还是挺多的,堆的数据结构本身并不算很难把握,本章的重点难点就是向下调整算法和向上调整算法,还有一些堆的性质,例如堆是完全二叉树,最后一层的节点必须是连续的,且堆只有两种结构,即大堆和小堆等性质,还有孩子节点的下标和父节点的下标的关系式。原创 2023-05-13 20:05:09 · 251 阅读 · 2 评论 -
树,二叉树----基础概念及性质
这章一些树和二叉树的概念以及性质都太多了,难度感觉还可以,就是有一些新名词要去记。特别要熟悉树和二叉树的性质。原创 2023-05-11 18:25:40 · 80 阅读 · 0 评论 -
栈和队列----循环队列详解
初次看循环队列的时候有点懵,没咋理解,后来又返回去看了一遍,这下全看懂了。相对来说,数组实现的循环队列比链表实现的循环队列要难点,就是那个循环点那儿得小心分析,不然就掉坑里了。链表实现循环队列感觉就是写循环单链表的感觉。原创 2023-05-10 09:00:00 · 333 阅读 · 0 评论 -
(C语言)用队列实现栈,用栈实现队列
最近在实训学爬虫,这两天看了下python,觉得比较有意思,好好学一下,希望真的能学到东西,用队列实现栈的这个题目,搞了我差不多大半天,一直在调,差点把电脑砸了,后来发现是Queuesize函数里面的那个计数器那里错了。后来先那个代码太乱了,索性直接删了重新写,理清思路后很快就写出来了,太搞心态了,总体来说,这两个题目还是很简单的,就是得把握好边界。原创 2023-05-09 16:31:02 · 78 阅读 · 0 评论 -
栈和队列----队列详解
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头。最近没啥状态,栈和队列都学的迷迷糊糊的,找个时间得好好复习一下。队列感觉还好,不是很难,可以理解,有时候一些边界会控制不好,有时候有自己的一些想法,但写出来就是依托答辩,根本不能跑,可能想法是错误的,也有可能就是没有真正理解吧。原创 2023-05-08 20:21:57 · 67 阅读 · 0 评论 -
栈和队列----栈详解
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。栈的不同实现形式:数组栈 即用顺序表实现的栈,性能方面优于链表栈。由于栈的特性,从栈中存取数据只能在栈顶,所以就不存在在栈底或栈的中间位置存取。将顺序表的头部做栈底,尾部做栈顶,栈存取数据更加方便。原创 2023-05-08 16:24:28 · 68 阅读 · 1 评论 -
单链表的带环问题延申
现在,来对问题进行一个延申:判断链表是否带环,若带环,返回第一个入环的结点。中的无头单向循环链表中提到了。判断单链表是否带环已经在。原创 2023-05-05 13:58:42 · 33 阅读 · 1 评论 -
链表------双向链表详解
双链表在增删改查方面比单链表方便很多,但在存储空间方面,单链表是比双链表更优的,根据场景不同,两种链表都能发挥出其优点。在学习链表方面,还是要注意区分头指针和头结点!不懂就查,不懂就问,不会就多练!原创 2023-05-05 11:55:00 · 1753 阅读 · 1 评论 -
链表-----单向链表详解
玩单链表的时候一定要注意区分头指针和头结点,在链表的初阶学习时,老师可能会对第一个结点直接取地址传过去,在无头单链表中,头指针和第一个结点重名,这就导致了当时学链表的时候很疑惑为啥一会儿传第一个结点的地址,一会儿传第一个结点的地址的地址。菜就多练!原创 2023-05-04 21:22:39 · 1524 阅读 · 2 评论