
数据结构
文章平均质量分 58
鼻里鼻里大学门卫
你看这小代码它平平无奇
展开
-
数据结构--归并排序(复习)
对于归并排序而言,最基本的类型是2-路归并,具体来说就是将待排序序列中前后两个相邻的有序序列归并为一个有序序列,注意,这里的两个序列都需要是有序的,两个无序的序列是无法归并的。但是很多时候待排序的数组中并没有现成的两个有序子数组供归并排序,这时候就需要人为制造局部有序的数组,在数组的每一个小区间都人为制造出有序数组,就可以从局部到整体,积少成多的将整个数组变为有序,这就是归并排序的思路。注:按照归并排序的思路,对于两个有序数组而言,如果直接将元素插入到它在排序后应该在的位置上,那势必会覆盖掉原来的元素,原创 2022-02-07 22:57:02 · 1024 阅读 · 0 评论 -
数据结构--快速排序(复习)
快速排序的核心思想是,对于一个数组,当我选定其中的一个数值(这里以数组当前的首元素为例),我通过交换等手段让数组中所有比该元素小的元素都跑到该元素的左边,所有比该元素大的元素都跑到该元素右边。完成后,再分别对该元素的左右两部分子数组进行同样的操作,依此类推,若干次运算之后,整个数组就可以排好序了。对于快速排序而言,每次确定中心点并以此为依据交换元素时,对于整个数组而言(因为计算几次之后,整个数组会被分成若干个小数组),时间复杂度都为O(N),因此制约快速排序速度的因素就是排序时处理的次数,亦即多少次循环原创 2022-02-06 22:15:10 · 535 阅读 · 0 评论 -
数据结构--选择排序和冒泡排序(复习)
对于选择排序和冒泡排序而言,二者的相同点是每一次循环结束后,都有元素被放到了最终其应该在的位置上。不同点在于冒泡排序每一次循环中会改变许多元素的先后顺序,一环套一环,而选择排序则是直接在众多待排序元素中直接找到当前的最大/最小值,并直接将其放到应该在的位置上。对于选择排序而言,可以对其进行加速,即每一次循环,不但要找最小值,同时也要找最大值,遍历了一遍未被排序的部分确定了最大最小值之后,将最大最小值分别放到当前的第一和倒数第一的位置上。这样可以把效率提升二倍。但是也会出现问题,由于最小值要和第一个数相交原创 2022-02-04 19:36:28 · 650 阅读 · 0 评论 -
数据结构--插入排序及衍生出的希尔排序(复习)
1,插入排序:插入排序之所以叫插入排序,是根据其排序特点来命名的。在插入排序的过程中,在整个待排序的数组内,具有从小到大顺序的元素个数从前向后逐次增加。每一次新的排序开始前,紧跟在已经排好序的小数组后面的第一个元素就会从后向前分别和小数组中的元素比较,如果该元素比数组中的一个元素小,那该元素的最终位置就应该在比它大的那个元素之前,继续向前比较,直到遇到第一个比它小的元素为止。只要该元素比某一个元素大,那这个元素就比前面的元素都要大,因为这个小数组之前就是排好序的了。最终这个元素所在的位置就是第一个比它小的元原创 2022-02-03 23:30:10 · 1091 阅读 · 0 评论 -
数据结构--堆的实现(复习)
特别需要注意的是堆是用数组实现的,因为堆中的元素是顺序存储的,而数组中的元素也是顺序存储的。(一般的二叉树不用数组来实现,而是用链表来实现,因为普通的二叉树中可能存储元素的密度很低,用连续存储的结构会造成大量的空间浪费。堆结构的初始化:和初始化一个数组类似,都是创建一个指针,和一些以后能用到的值。(针对结构体而言,不同于链表中结构体就代表链表中的某一个具体的节点,有关数组的结构体相当于对数组整体都可以施加影响的操作)void HeapInit(HP* hp){ assert(hp); hp-原创 2022-01-29 20:57:06 · 1011 阅读 · 1 评论 -
数据结构--双向链表的实现(复习)
相比于之前的顺序表和单链表,双向链表的实现更复杂,但是到了实操环节则更简单。就好比高速公路相比一般的柏油马路更难修建,但是汽车在高速公路上却可以跑得更快。需要特别注意的是,双向带头链表为空的条件是head->next=next。head节点处不存储数据,head节点充当哨兵位节点。当双向链表中只有一个哨兵位节点时,说明双向链表为空。结构体的定义:双向链表有两个指针,和一个数值。定义结构体时考虑这三个部分即可。typedef int LTDateType;typedef struct L原创 2022-01-27 22:52:33 · 1391 阅读 · 0 评论 -
数据结构--链表的实现(复习)
单链表的定义不同于顺序表,顺序表是整体定义的,需要定义顺序表的容量和当前包含多少元素。而链表只需要定义单个元素的种类和指向下一个元素的指针即可。(相比之下,同样是借助结构体,顺序表的结构体是整个链表,而链表的结构体只能代表其中的一个节点。typedef int SLTDatatype;typedef struct SLTNode{ SLTDatatype data; SLTNode* next;}SLTNode;打印出链表中的每一个元素:void SListPrint(SLTNode*原创 2022-01-26 21:35:13 · 894 阅读 · 0 评论 -
数据结构--顺序表的实现(复习)
检查为顺序表所准备的存储空间是否够用的函数:如果存放在顺序表中的元素个数已经等于了顺序表的容量,那就需要为顺序表新增存储空间,如果原空间原本就为空,则为其新申请的空间为4字节,否则新申请的空间大小为原空间的二倍。void SeqListCheckCapacity(SL* ps){ if (ps->capacity == ps->size) { SLDataType newcapacity = ps->capacity == 0 ? 4 : (ps->capacity)原创 2022-01-25 22:20:25 · 185 阅读 · 0 评论 -
数据结构-直接排序
1,hoare版本hoare版本分为两种情况,第一种是定义两个整型L和R,分别对应待排序数组第一和最后一个元素的下标。同时,定义一整型k对应第一个元素的下标。两种情况分别为:一,当选择最右边的值做key时,右边(R)先走,左边(L)后走,L找比key大的数,R找比key小的数,当二者均找到目标元素时,将两元素对调,然后继续L先走,Y后走。当L与Y相遇时,将相遇的位置处的节点与最左边key对应的节点互换。二,当选择最左边的值做key时,左边(L)先走,右边(R)后走,L找比key大的数,R找比原创 2022-01-19 19:57:21 · 562 阅读 · 0 评论 -
数据结构-排序
1,直接插入排序:比如说对于一个有n个数字的数组,我要将其按从小到大的顺序排序,我先假定现在排在第一位的元素就是第一个,然后将第二个元素与其相比较,如果第二个元素较小,则先令int x=a[2],a[2]=a[1](将第一个元素的值赋给第二个位置)再令a[1]=x(这一过程类似交换两个变量的值的操作,都需要额外定义一个变量以避免在交换的过程中变量的值互相覆盖)依此类推,在比较k次时,前k+1个元素的值都已经是有序的了,因此后面的值再参与比较时,只需要从后向前依次比较,知道遇到某元素<k时,brea原创 2022-01-18 22:45:36 · 422 阅读 · 0 评论 -
二叉树中的递归思想
按我的理解,递归的过程就是一个上楼梯加上下楼梯的过程(每一层台阶都是相同的,但是一级比一级高),在设计递归程序时,除了“台阶”之外,还要设计一个边界条件,在到达这个边界条件时,递归程序内部不会再向下递归(套娃),而是直接返回一个返回值,这个返回值又会成为其上一层递归的初始条件,这样就相当于开始一级一级的下楼梯。1,前、中、后序遍历以前序遍历为例,先访问根节点,然后是左节点,然后是右节点,并依此类推,访问全部的节点。由于在整个访问过程中的每一步,都遵循着上述的逻辑,因此这里就非常适合用递归思想来解决。原创 2022-01-17 21:54:49 · 2238 阅读 · 1 评论 -
数据结构-堆的插入和排序(向上调整+向下调整)
堆在本质上就是一个用数组实现的二叉树,而堆在排序方面又分为大堆和小堆,在大堆中,任何一个双亲结点都大于其孩子结点,小堆反之。向上调整:堆排序本身并不难,但问题在于向堆中插入一个节点时,由于该节点可能拥有任何值,因此该节点插入后,该堆可能就不符合原先大堆的特点了。这时就需要向上调整。对于新插入的孩子节点而言,假设其下标为child(child的值等于当前数组的长度-1),如何找到其双亲节点呢?孩子节点和双亲节点的下标具有如下关系:parent=(child-1)/2。根据这一关系,就可以找到新插入原创 2022-01-16 21:26:21 · 1243 阅读 · 0 评论 -
数据结构-用栈实现队列
用栈实现队列本质上是用两个后进先出的栈来实现后进后出的效果。思路:初始化两个栈,一个栈中有数据,一个为空。将非空的栈中的数据依次取出来,放到空栈中,全部元素都处理完之后,在按栈的顺序把原本的空栈中的数据依次取出来。由于栈先进后出的特点,先进入非空栈的元素也就会后出栈,也就会后进入空栈中,也就会先从空栈中出栈。这样就实现了队列先进先出的性质。代码实现:typedef struct{ ST pushST; ST popST;}MyQueue;MyQueue* myQueueCre..原创 2022-01-15 21:47:23 · 250 阅读 · 1 评论 -
数据结构-用队列实现栈
用队列实现栈在本质上就是实现栈“后进先出”的特点。思路:用两个队列来实现,一个队列中存储所有的元素,另一个队列为空。为了实现后进先出的目的,我需要考虑如何把最后一个进入队列的元素(即非空队列中的最后一个元素)最先拿出来。具体实现方式是:先把非空队列中除最后一个元素之外的所有元素按顺序拿出来放到空队列中,拿出来之后立刻将其在原队列中删除。然后返回原先的非空队列中的最后一个值(很容易做到,这时该节点已成为该队列中的第一个元素)。代码实现:typedef struct { Queue .原创 2022-01-15 20:17:05 · 283 阅读 · 0 评论