
数据结构
文章平均质量分 87
zhangcoder
大一 KEEP CODING!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
CC26.【C++ Cont】动态内存管理(new和delete)浅析和面向对象的方式实现链表
有关malloc和new,delete和free的区别这里不做讲解,竞赛中只需要知道怎么用就行。注:为防止new开辟空间失败,建议判断p1和p2是否为空,或者assert断言。注:new不是只能给内置类型开辟空间,也可以给自定义类型开辟空间,例如结构体。格式:delete 指针 或 delete[] 指针(数组的空间)new返回的是申请到的内存空间的起始地址,因此需要指针来接收。和C语言一样,在堆区上自行申请空间和释放空间,new申请一个变量的空间,new。申请连续的内存空间即申请数组空间。原创 2025-01-28 08:40:24 · 1245 阅读 · 0 评论 -
124.【C语言】数据结构之快速排序的小区间优化和非递归的解决方法
回顾文章的一般情况下快排的时间复杂度类似二叉树, 下面分析二叉树的特点注意到二叉树的最后一层节点个数为近似占总节点个数的一半(有关二叉树计算方面的知识参见文章),因此越往二叉树的下方,递归的次数越多, 一般情况下快排递归近似二叉树,如果能适当减少递归的次数,可以提高效率解决掉最后一层能减少一半递归次数,解决掉最后三层能减少的递归次数!!可以想到一个方法:越往二叉树的下方,子数组的元素个数越少,不用递归,用其他的排序方法★要注意到递归到小区间的特点,数组的大部分元素是的(即。原创 2025-01-07 21:20:34 · 1154 阅读 · 0 评论 -
123.【C语言】数据结构之快速排序挖坑法和前后指针法
虽然能完成快速排序,但该代码的可读性较差,建议专门定义一个变量hole_i表示坑位的下标,则arr[hole_i]表示坑位,可写成如下形式。2.cur找到比key(key==arr[key_i])小的值,prev++,arr[cur]和arr[prev]位置的值交换,cur++最终left和right相遇,在坑位填上key的值,单趟快速排序结束,之后对左右两个区间排序,递归处理,写成完整的挖坑法的快速排序。设key_i==0,则arr[key_i]==6,数组长度为n,对。main.c写入以下代码。原创 2025-01-05 15:29:59 · 1171 阅读 · 0 评论 -
122.【C语言】数据结构之快速排序(Hoare排序的优化)
针对121.【C语言】数据结构之快速排序(未优化的Hoare排序存在的问题)以及时间复杂度的分析文章分析出的问题,本文讲一部分问题的解决方法原创 2025-01-03 18:35:00 · 872 阅读 · 0 评论 -
121.【C语言】数据结构之快速排序(未优化的Hoare排序存在的问题)以及时间复杂度的分析
上述三种是快排最坏情况循环的次数为N+N-1+N-2+...+1,为等差数列求和,时间复杂度为。进行排序,这样导致函数的栈帧开辟的空间越来越大,函数没有没有及时返回(销毁),从而导致栈溢出。第一行排n次,第二行排(n/2)*2次,第三行排(n/3)*3次,...,第lgn行排n次。发现 a1[0]==a1[1]==a1[2]==...==a1[N-1]仔细看看测试代码1是怎么"量身定制"的:(下面展示关键代码)的数组产生栈溢出的问题,由于是递归调用,则栈溢出的原因显然是。文章的Hoare排序代码的性能(原创 2025-01-02 08:30:40 · 1361 阅读 · 0 评论 -
120.【C语言】数据结构之快速排序(详解Hoare排序算法)
③ left找到arr[left]比key小的就停止right需要找到arr[right]比key大的,之后arr[left]和arr[right]交换,left和right继续寻找,直到left>right或left==right退出。执行到Swap(&arr[key_i], &arr[left]);arr[right] == arr[key_i] 和 arr[left] == arr[key_i]时right没有变化,导致。例如对于无序数组arr={6,1,2,7,9,3,4,5,10,8},排升序。原创 2024-12-28 19:04:49 · 1436 阅读 · 0 评论 -
119.【C语言】数据结构之快速排序(调用库函数)
由于a是void*类型的,使用前应该强制类型转换为MyType类型,之后再解引用。注意到比较函数的返回类型为int(显然有三种情况,负数,0和正数)转到反汇编,查看compare函数的第一个指令的机器码和地址。测试以下代码,下断点至return 0;在内存窗口中输入0x00C613FC后发现内存窗口。size:每个元素所占的空间(类型size_t)num:数组元素的个数(类型size_t)base:指向要排序的数组(即数组名)函数没有返回值(void类型)网站给出比较函数的写法。原创 2024-12-27 19:12:15 · 946 阅读 · 0 评论 -
118.【C语言】数据结构之排序(堆排序和冒泡排序)
如果j==n-1之前数组就已经处于有序状态(即当内循环的Swap函数一次没有执行时),可以提前退出循环。注意bool exchange_flag = false;不能写在外循环的外面,否则无效。,但没有详细讲过内外循环的细节上的处理和写法上的逻辑,本文将深入讲解。之前讲过这个经验:写排序应该先写单趟排序,后将其嵌入外循环中发挥作用。例如无序数组arr={5,3,1,2}的第一次单趟排序。例如无序数组arr={5,3,1,2}的第一次单趟排序。以情况2代码为例,嵌入大循环中。以情况1代码为例,嵌入大循环中。原创 2024-12-26 23:00:45 · 752 阅读 · 0 评论 -
117.【C语言】数据结构之选择排序
因此在下一步交换前先进行判断,如果最大值出现在最左侧(即left==max_i,下标重叠),应该修改max_i的下标。给定数组int arr[]={3,5,1,6,2,3,7,9,0,8}对其使用选择排序。②将最小值和数组的第一个元素的值互换,最大值和数组的最后一个元素的值互换.如果出现left等于最大值的下标,应该将最大值的下标赋值为最小值的下标。}(结束后,下一次循环max_i==,min_i==3)-->{,最终出循环时,min_i==5,max_i==3,画图可表示为。设想的思路是否正确?原创 2024-12-25 21:43:52 · 870 阅读 · 0 评论 -
116.【C语言】测试排序性能的模板代码
1.需要包含头文件2.注意到clock的返回值为clock_t,可以看到在time.h有对clock_t的typedef,long为长整数类型,显然打印用%ld3.功能:返回处理器的消耗的时间。原创 2024-12-21 21:28:16 · 617 阅读 · 0 评论 -
115.【C语言】数据结构之排序(希尔排序)
gap = gap/3 + 1,对于任何一个数n,其n/3/3/3/3/3/3/3/3/3.....结果不为0前,三种可能:1或2,若为gap = gap/3 + 1保证循环结束后gap==1(2/3+1==1,1/3+1==1,0/3+1==1)以升序为例,如数组int* arr[]={9,1,2,5,7,4,8,6,3,5};以gap /= 2为例,初始gap==n,无论n取何值,最后一次循环gap==1,没有必要调用InsertSort。的:{1,4,7,9}、{0,6,7}、{-1,2,3}原创 2024-12-21 20:51:57 · 1201 阅读 · 0 评论 -
109.【C语言】数据结构之求二叉树的高度
将任务交给多个“下属”去做递推:整个树的高度==根节点的高度+左右子树高度中较大的高度左子树的高度==根节点的高度+其左右子树高度中较大的高度右子树的高度==根节点的高度+其左右子树高度中较大的高度......回归:当节点为NULL时(即遇到空树),回归原创 2024-12-20 19:04:32 · 1356 阅读 · 0 评论 -
112.【C语言】数据结构之排序(详解插入排序)
使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。原创 2024-12-13 20:42:07 · 1218 阅读 · 0 评论 -
110.【C语言】数据结构之判断是否为完全二叉树
根节点出栈,出栈前需要保留根节点的地址,以便于左右节点入栈(front->left和front->right,不是root->left和root->right)初始化队列-->非空树,将根节点的地址入队-->层序遍历+出栈+入栈-->对队头的值判断(为NULL则一直出队,遇到非空则销毁队列+返回false)如果写成front->left和front->right,每次循环时,front的值会改变(依据。root一直是整个二叉树根节点的地址,导致root->left和root->right的值。原创 2024-12-12 20:05:48 · 588 阅读 · 0 评论 -
109.【C语言】数据结构之二叉树层序遍历
定义:按层的方式遍历(,设n为树的深度,h==1-->h==2-->h==3-->...-->h==n)以"知识回顾"的二叉树画图分析if (root) {QueuePush(&q,root);h==3为第三层,有3,5和6;既存储了树的节点的地址又存储了下一个节点的地址(这样做方便操作)可以看到QueuePop的free(pq->head);遍历顺序:1-->2-->4-->3-->5-->6。核心思想:先出队一个根节点,后将根的左右非空节点入队。这里用的是队列,画图分析上方二叉树的层序遍历。原创 2024-12-08 20:27:55 · 534 阅读 · 0 评论 -
98.【C语言】数据结构之队列
Queue.h写入int size;}Queue;除了有头指针和尾指针之外,还要用变量size来存储队列的大小再用一个结构体去定义队列中的每一个节点}QNode;这里和以往的链表的定义不一样,用两个结构体来定义 ,将头指针,尾指针和size打包成结构体是为了方便操作。原创 2024-12-05 18:53:09 · 1428 阅读 · 0 评论 -
108.【C语言】数据结构之二叉树查找值为x的节点
查找值为x的节点并返回节点的地址。有详细的递归调用展开图原创 2024-12-01 12:11:46 · 744 阅读 · 0 评论 -
107.【C语言】数据结构之二叉树求总节点和第K层节点的个数
答:不可以,理由1:无论函数调用多少次,写在函数内的静态变量只会被初始化一次,即第二,三,四,...次调用不会初始化.理由2:在函数外部无法访问静态变量。原创 2024-11-29 21:05:32 · 1630 阅读 · 0 评论 -
106.【C语言】数据结构之二叉树的三种递归遍历方式
在文章中提到:任何一棵树都由两部分构成:根和子树,子树又由根和子树构成因此看见二叉树要本能地做出反应:拆成三部分:根,左子树和右子树,直到遇到空树(叶节点)则停止拆分。原创 2024-11-27 20:08:08 · 1790 阅读 · 0 评论 -
105.【C语言】数据结构之TopK问题详细分析
TopK即排名位于前K个(按从大到小或从小到大排序)原创 2024-11-26 19:11:39 · 1196 阅读 · 0 评论 -
104.【C语言】数据结构之建堆的时间复杂度分析
用堆对数组进行排序,排升序建大堆的时间复杂度总为对比//向上调整建堆时间复杂度为O(N*logN)i < n;i++)//排序的时间复杂度为O(N*logN)end--;和//向下调整建堆时间复杂度为O(N)i >= 0;i--)//排序的时间复杂度为O(N*logN)end--;注意(n-1-1)/2这里把(n-1)视作整体2%5E02%5E12%5E22%5E3...+...+...+原创 2024-11-24 20:14:52 · 977 阅读 · 0 评论 -
103.【C语言】数据结构之用堆对数组排序
向上调整:向下调整:建大根堆还是小根堆?由小根堆的定义:树中所有的父节点的值都小于或等于孩子节点的值,这样排出来的数组时升序的,建小根堆调用向上调整函数即可(把画圈的地方改成原创 2024-11-24 19:04:48 · 564 阅读 · 0 评论 -
102.【C语言】数据结构之二叉树的堆实现(顺序结构) 2
尾删没有任何意义,删头才有意义(即删),删除之后要调整二叉树,仍然符合大根堆的性质拿上图举例,现删除堆顶元素50。原创 2024-11-22 19:13:49 · 1274 阅读 · 0 评论 -
101.【C语言】数据结构之二叉树的堆实现(顺序结构) 1
1.2.可以用结构体来定义堆,由于堆的底层是用数组存储的,因此三个成员变量:数据域,大小size,容量capacity写入头文件中int size;}HP;原创 2024-11-20 19:44:29 · 1473 阅读 · 0 评论 -
100.【C语言】数据结构之二叉树的基本知识
非线性数据结构(线性的数据结构:顺序表、链表和队列),结构类似倒过来的树(根朝上叶朝下任何一棵树都由两部分构成:根和子树,子树又由根和子树构成......int data;或者使用数组int data;上述两种定义的方法不高效,需要手动设置多个结点,而且只针对于N已知的情况,其实使用"左孩子+右兄弟"的方法更简单例如下面这个二叉树用"左孩子+右兄弟"方法画图。原创 2024-11-18 21:22:54 · 982 阅读 · 0 评论 -
99.【C语言】数据结构之栈
栈1.基本概念2.提炼要点3.概念选择题4.栈的实现 栈初始化函数 入栈函数 出栈函数和栈顶函数栈销毁函数原创 2024-11-14 19:02:37 · 1512 阅读 · 0 评论 -
98.【C语言】存储体系结构
中,由于数组在本质上是一块连续的内存空间,因此缓存的命中率高,链表靠指针访问,不连续,,因此缓存的命中率低(缓冲污染:加载了没用的数据,对于链表的访问会经常发生)当想对顺序表或链表的每个位置进行遍历访问(读或写)时,CPU会读取缓存中的数据,如果缓存中有顺序表或链表的数据,则称为。,而且一次性会加载多个字节(具体加载多少和硬件有关)缓存分三级:速度:一级>二级>三级。文章提到了数据结构的定义: 数据在。,若不命中,CPU会要求将。缓存的大小原创 2024-11-10 11:20:56 · 449 阅读 · 0 评论 -
97.【C语言】数据结构之双向链表的头插,头删,查找,中间插入,中间删除和销毁函数
1.双向链表的头插 方法一 方法二2.双向链表的头删3.双向链表的销毁4.双向链表的某个节点的数据查找5.双向链表的中间插入5.双向链表的中间删除6.对比顺序表和链表原创 2024-11-10 10:46:48 · 856 阅读 · 0 评论 -
96.【C语言】数据结构之双向链表的初始化,尾插,打印和尾删
1.双向链表2.结构体的定义3.示意图3.代码示例1.双向链表的尾插示意图代码main.cList.hList.c详细分析代码的执行过程双向链表的初始化2.双向链表的打印代码3.双向链表的尾删原创 2024-11-09 16:10:11 · 1310 阅读 · 0 评论 -
92.【C语言】数据结构之单向链表的查找,中间插入和删除,销毁
链表的查找函数;链表的修改函数有了查找函数,就可以轻松实现修改函数修改函数的策略:先查某个节点的数据,再对这个数据进行修改分析原因:当pos为头指针时,pos和prev指针存储的内容是一样的,第一次循环条件prev->next!=pos成立,错过了prev->next==pos的机会,则while会一直循环,直到prev为NULL(x86下存储的00 00 00 00),出现NULL->next是不合法的,因此报错3.pphead不能为NULL(即plist存储的地址不能为NULL),plist原创 2024-10-27 15:07:37 · 794 阅读 · 0 评论 -
86.【C语言】数据结构之链表的总体概述
一种物理存储单元上非连续(因为用了指针)、非顺序(因为用了指针)的存储结构,用于线性方式存储数据(对比数组:元素的顺序集合)链接。原创 2024-10-20 16:04:41 · 988 阅读 · 0 评论 -
85.【C语言】数据结构之顺序表的中间插入和删除及遍历查找
中间的位置:结构体指针SL* ps(这样就可以使用ps->a[...])和插入的位置int pos插入的元素数据:SLDataType x。原创 2024-10-19 10:36:49 · 653 阅读 · 0 评论 -
84.【C语言】数据结构之顺序表的头部插入和删除
注意头插时,元素会逐个向后移动,因此要先进行容量检查,再移动元素,最后不要忘记为有效元素个数size+1;头插N个元素的时间复杂度为O(N^2),运行效率不高,尽量避免头插,使用尾插(尾插N个元素的时间复杂度为O(N))2.分析头部删除函数注:ps->size可能为负数,因此要断言ps->size的正负原创 2024-10-19 09:28:26 · 579 阅读 · 0 评论 -
83.【C语言】数据结构之顺序表的尾部插入和删除
3.操作顺序表2."伪"插入顺序表的元素分析尾部插入函数SLPushBack代码示例SeqList.hmain.cfree(指针)出错的几种可能的原因3."伪"删除顺序表元素2.分析尾部删除函数SLPopBack代码示例错误检查两种解决办法1.判断size是否为负数2.assert断言size的大小(直接强制终止运行)承接82.【C语言】数据结构之顺序表的初始化和销毁的3.操作顺序表原创 2024-10-18 08:49:32 · 1111 阅读 · 0 评论 -
E41.【C语言】练习:斐波那契函数的空间复杂度的计算及函数调用分析
用调用堆栈来分析Fib嵌套函数调用的细则原创 2024-10-14 09:00:00 · 465 阅读 · 0 评论 -
81.【C语言】数据结构之空间复杂度
对一个算法在运行过程中临时占用存储空间大小的量度,不是程序占用了多少bytes的空间,通常用多少个变量来衡量,也使用大O渐进表示法(有关大O渐进表示法见80.【C语言】数据结构之时间复杂度原因:函数运行时所需要的栈空间(存储参数,局部变量,一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定(一定要理解额外的含义)原创 2024-10-13 11:06:18 · 582 阅读 · 0 评论 -
63.【C语言】再议结构体(上) 结构体的特殊声明和内存对齐
不完全声明,即结构体没有自己的名字(没有结构体标签)*数据结构:数据在内存中的存储结构*常见的数据结构:数组,记录,链表*一个典型的数据结构----链表:一种物理存储单元上非连续(因为用了指针)、非顺序(因为用了指针)的存储结构,用于线性方式存储数据(对比数组:元素的顺序集合)下面这张图(摘自《计算机科学导论》)体现非顺序65-->66-->72-->96-->85-->74原创 2024-09-28 15:18:06 · 1322 阅读 · 0 评论 -
80.【C语言】数据结构之时间复杂度
参见63.【C语言】再议结构体(上)也可以理解为数据在内存中的存储形式(管理数据)比如说写通讯录可以用静态数组,动态数组和链表形式存储简单的定义:一系列的计算步骤,用来将输入数据转化成输出结果若次数为常数,时间复杂度为若次数为N的表达式1.取最高阶的式子(去常数) 2.去掉最高阶式子前的系数若存在最好,最坏情况,取最坏的情况作为时间复杂度。原创 2024-10-12 14:57:57 · 1172 阅读 · 0 评论