数据结构
文章平均质量分 68
时间复杂度、空间复杂度、顺序表、链表、排序
二十5画生
野蛮其身体,文明其精神
展开
-
排序算法的稳定性
例如,2 2 2 1 0 建立的大堆,要进行升序排序,由于是父亲大于等于孩子,所以,是左孩子还是右孩子都有可能,导致位置发生变化。空间:O(logN) 因为,最多开到递归最底层的空间数,往回的时候就不再开辟空间,时间是累积,空间不累积。稳定,取小的尾插,相等的也尾插,如果有相等的值,也会是左边区间的先进来,然后才是右边区间,相对顺序不改变。稳定性就是,原始数据中的前面的5和后面的5,在排序过后的序列,相对顺序依旧不变,就是稳定性。因为,在现实的生活中,比较的就不仅仅是数据,还需要考虑其他的因素。原创 2024-03-05 21:32:46 · 395 阅读 · 0 评论 -
归并排序详解
归并排序基本思想:假设有两组数已经排好序的数据,一组为a,一组为b归并的意思,就是将a和b两组数据合并在一起,得到一个新的有序序列,这就是所谓归并但是现在的问题是,有一组序列是无序的。我们需要要对这个本来无序的数据进行排序。如果要利用归并排序,那么就要使得这原本只有一组数据的序列变成两组有序的序列然后再对这两组序列进行排序那么,我们要怎么做,才能将这一组序列变成两组有序的序列呢?可以利用递归的思想例如有八个待排序序列进行分割8个分成4个,左区间4个,右区间4个。原创 2024-02-29 22:23:47 · 315 阅读 · 0 评论 -
冒泡、插入、希尔、选择、堆排序、快速排序(附源码)
向下调整建堆:倒着往上调整,而叶子节点是不需要向下调整的,所以调整位置从最后一个节点的父亲节点开始向上,逐个进行向下调整我们的数据序列在物理结构上是一个数组,逻辑上是一个二叉树,从最后一个节点的父亲节点开始,依次向前,对数组的每一个数据进行向下调整,这样就保证了每一个节点都进行了向下调整建堆因此,比较重要的是向下调整的逻辑:原创 2024-02-29 18:42:16 · 1182 阅读 · 2 评论 -
堆详解以及简单的堆排序(源代码)
堆是将数组看作一颗完全二叉树大堆:任意一个父亲大于等于孩子小堆:任意一个父亲小于等于孩子有序数组一定是堆但是堆不一定有序注意:此“堆”是一个数据结构,用来表示完全二叉树还有另外一个“堆”,是内存区域的划分,是我们动态申请内存的内存区域,属于操作系统的概念属于不同学科中的同名概念而已。原创 2024-02-19 12:48:53 · 255 阅读 · 0 评论 -
堆的实现(源码)
堆一般,是将数组看作一颗完全二叉树小堆要求:任意一个父亲=孩子有序数组一定是堆但是堆不一定有序注意:此“堆”是一个数据结构,用来表示完全二叉树还有另外一个“堆”,是内存区域的划分,是我们动态申请内存的内存区域,属于操作系统的概念属于不同学科中的同名概念而已堆的意义是什么?1、堆排序,O(N*logN)(在一堆数据中找到某个数据)2、top K问题(一堆数据中找到前K个最大或者最小的数据)堆二叉树插入值:向上调整,和其祖先进行比较。原创 2024-02-03 22:32:04 · 731 阅读 · 0 评论 -
622.设计循环队列(附带源码)
事实上,数组判断空和满,也没那么复杂,我们可以多定义一个size记录数组的数据个数,为0就是空,满就是满。注意,我们的rear和front是下标,我们开辟了K+1和空间,那么我们开辟的是数组,数组的最后一个位置的下标是K,当rear指向数组最后一个位置时,rear的值等于最后一个位置的下标,就是K。如果不多加一个空间位置,那么当队列为空的时候,front和back相等,当队列满的时候,front和back也相等。其实也一样的,不同的方案有不同的施行成本,看你自己吧,只要链创建好了,其实也好处理。原创 2024-01-24 21:49:40 · 852 阅读 · 0 评论 -
栈实现队列(附带源码)
很简单,将pushsatck栈中的数据再倒到popstack即可。例如说popstack栈已经出空了,后面还有出队列,怎么办?一个叫pushsatck,用来入队列。一个叫popstack,用来出队列。那么,怎么用栈实现队列呢?很简单,首先,创建两个栈。原创 2024-01-24 19:47:26 · 416 阅读 · 0 评论 -
225.用队列实现栈(附带源码)
所以,创建两个队列入栈,那个不空入那个出栈,移动不空的队列的前n-1个到空队列,出队列第n个很简单总的来说,就是。原创 2024-01-24 18:05:26 · 386 阅读 · 0 评论 -
20.有效的括号(附带源码)
【代码】20.有效的括号(附带源码)原创 2024-01-23 18:21:40 · 410 阅读 · 0 评论 -
(单链表实现)队列的实现(附带源码)
【代码】(单链表实现)队列的实现。原创 2024-01-23 11:40:21 · 376 阅读 · 0 评论 -
单链表的增删查改(附有代码)
顺序表的问题:1、尾部插入可以,但是头插或者中间的插入,需要挪动中间的数据,效率底下2、扩容需要付出代价,例如内存空间的碎片化、以及对空间的利用不充分。比如说只有101个数据,空间满足是100,只能扩容到200,便浪费了大量的空间。扩容的少,便会频繁扩容;扩容的多,导致浪费。那么为了解决这个问题,就有人提出,能不能我要多少内存我就申请多少内存呢?例如说,我要三个,就给三个,要5个就给5个。但是这些空间并不是连续的。这个时候问题又来了,我要如何管理这些数据的空间呢?原创 2024-01-21 11:38:08 · 904 阅读 · 0 评论 -
带头 双向 循环链表增删查改实现((附带源码))
【代码】带头 + 双向 + 循环链表增删查改实现。原创 2024-01-22 20:51:51 · 599 阅读 · 0 评论 -
数组实现栈(附带源码)
【代码】数组实现栈(附带源码)原创 2024-01-22 21:41:13 · 375 阅读 · 0 评论 -
C语言二叉树深度详解(附带源码)
一个节点含有的子树的个数称为该节点的度:度为0的节点:度不为0的节点:一个节点含有子节点,这个节点称为子节点的父节点(国外有些书称为双亲结点,涉及到女权主义):一个节点含有的子树的跟节点称为该节点的子节点:还有同一个父节点的节点互称为兄弟节点:一棵树中,最大的节点的度称为数的度:从根节点开始,根为第一层,根的子节点为第二层,以此类推(关于空树的高度最好从1开始,如果从0开始,空二叉树高度为0,而你只有一个根节点也称为0,矛盾)从该节点开始,往上回溯,都是该节点的祖先。原创 2024-02-22 12:51:35 · 1260 阅读 · 0 评论 -
C语言队列详解
即直接将头的索引向后移动给一个位置,但是这会导致一个问题,即如果队列满了,那么前面的空间要不要?//但是这存在一个问题,当队列只有一个时,释放完后,head会被赋予新值NULL。变成野指针之后,例如入队列,访问到pq->tail->next就是非法访问。但是tail没动,但是其指向的空间已经free,此时tail就是野指针。由于队列的特殊插入和删除结构,即不论如何,出队列的数据总是连续的。就是简单的单链表,头就是对头,尾就是队尾。入队列的一端叫做队尾(也就是插入数据)入队列就是尾插,出队列就是头删。原创 2023-11-08 12:08:51 · 87 阅读 · 0 评论 -
栈括号匹配(附带源码)
注意:在匹配右边时,不符合就return faulse,但在这之前要销毁栈。2、如果匹配完毕,栈还剩余元素,即左括号多,匹配失败。1、如果执行到栈为空,即所有的括号都匹配,匹配成功。只要是左边的括号,直接入栈,top++只要是右边括号,取top进行匹配。原创 2023-10-28 22:19:51 · 51 阅读 · 0 评论 -
数据结构-栈(图和代码详解)
1、头节点做栈底,尾节点做栈顶,入栈没问题,但是出栈就会出问题,因为还需要找到前一个位置,相当于尾删,单链表不支持随机访问,必须定义一个指针记录其前一个位置,不简洁,不方便,啰嗦,难受。//而这里直接st->top--,意思是现在没有删除,但是我的栈顶元素却已经指向了下一个,不管你栈顶后面的数据。因为,我访问的数据只能是栈底到栈顶,其他数据不在我的范畴内,我不管。栈是一种特殊的线性表,只允许在固定一端插入数据和删除数据,数据插入和删除的一端叫做栈顶,另外一端叫做栈底。即入数据在栈顶,出数据也在栈顶。原创 2023-10-27 23:34:16 · 66 阅读 · 0 评论 -
双向带头结点链表全面详解(附带源码)
1、头插2、尾插3、随机插入5、销毁6、判空7、打印8、找元素9、头删10、尾删11、总结原创 2023-10-26 23:48:00 · 85 阅读 · 0 评论 -
动态顺序表(详解)附带源码
常见的顺序表有:顺序表、链表、栈、队列、字符串等逻辑结构:一条线,即一个元素接着一个元素,类似于:1-2-3-4-5-6-7-。逻辑结构:一条线,即一个元素接着一个元素,类似于:1-2-3-4-5-6-7-。在动态分配内存时,因为有分配内存失败的可能,所以每次分配都要进行检验,增加程序容错。1、造成空间浪费,比如,100个元素满了之后只要加一个元素,但是空间却是200。物理结构:即数据在计算机内的实际存储结构,通常以数组和链式结构的形式存储。size记录的是最后一个元素的下一个位置的位置,原创 2023-10-23 22:53:26 · 44 阅读 · 0 评论 -
动态内存管理详解(malloc、realloc、calloc)
/在上述代码中,在函数中可能因为if条件直接return而导致p的空间并没有被释放,而到了主函数调用的时候,p指针已经结束了其生命周期,就是指针p已经不存在了,那我们就找不到这一块空间,连释空间的机会都还没有这种情况下,就会导致,1、:当s后面的存储空间不够开辟新的空间,那么就会重新找到一个新的足够大的地址开辟空间,返回新地址,这会导致一个隐患:内存碎片化,降低内存使用率。而事实上,空间还给操作系统之后,p指针依然存在,依旧记录着某地址,但是此时没有具体的指向,变化了野指针,此时就要p=NULL。原创 2023-10-18 11:51:14 · 75 阅读 · 0 评论