![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
考研数据结构
文章平均质量分 68
考研数据结构知识点及其代码
需要什么私信我
念念不忘,必有回响。我要上岸,一定要上岸,只能上岸。
展开
-
希尔排序带详细注释
在希尔排序中,数组被分为多个子数组,并对每个子数组进行插入排序。每次排序后,子数组的大小(间隔)都会逐渐缩小,直到间隔为1(普通插入排序),完成排序。以上代码演示了对一个整数数组进行希尔排序的过程,并输出排序后的结果。以下是使用C语言实现希尔排序的代码示例,注释详细解释了每一步的逻辑:#include <stdio.h>// 在间隔为 gap 的元素中进行插入排序。// 对每个间隔进行插入排序。printf("排序后数组:");// 初始化间隔为数组长度的一半。printf("原始数组:");原创 2024-01-02 22:32:00 · 355 阅读 · 0 评论 -
折半插入排序带详细注释
先,在binarySearch函数中实现了折查找插入位置的功能。然后,在binaryInsertionSort函数中使用折半查找的结果,通过移动元素和插元素的方式来实现排序。最后,在main`函数中测试了排序算法的功能注意,以上代码中使用的是数组来存储待排序的元素。下面是一个用C语言实现的折半插入排序算法,同时附有详细的注释。#include <stdio.h>printf("\n排序后:");// 将较大元向后移动。//入元素到正确位置。// 折半查找插入的位置。// 折半插入排序算法。原创 2024-01-02 22:30:11 · 388 阅读 · 0 评论 -
直接插入排序带详细注释
我们通过 sizeof 运算符获取数组的大小,并将其除以每个元素的大小,得到元素个数 n。在每一次循环中,我们将要插入的元素 key 存储在临时变量中,并将已排序部分的最后一个元素的索引存储在变量 j 中。然后,我们通过一个循环将大于 key 的元素依次往后移动,为要插入的元素腾出位置。最后,我们将 key 插入到正确的位置,这里是将它赋值给 arr[j + 1]。// 将大于 key 的元素往后移动,为要插入的元素腾出位置。j = i - 1;// 从数组的第二个元素开始,将每个元素插入到已排序的部分。原创 2024-01-02 22:27:48 · 355 阅读 · 0 评论 -
快速排序带详细注释
上述代码中,swap函数用于交换数组中两个元素的位置,partition函数用于寻找分割点并进行分割,quickSort函数用于实现快速排序算法。在main函数中,我们创建了一个整型数组arr,并通过sizeof运算符计算数组的长度,将其传递给quickSort函数进行排序。// 如果当前元素小于等于分割点,将其与i指针指向的元素交换位置。// 设置两个指针i和j,i指向分割点之前的位置,j用于遍历arr数组。// 将分割点放置在正确的位置。// 交换数组中两个元素的位置。// 寻找分割点并进行分割。原创 2024-01-02 22:23:49 · 309 阅读 · 0 评论 -
冒泡排序代码
这段代码中的 bubbleSort 函数实现了冒泡排序算法。在 main 函数中,我们定义了一个整型数组 arr,然后调用 bubbleSort 函数对数组进行排序。最后,我们输出排序后的数组。// 交换arr[j]和arr[j+1]以下是用C语言实现冒泡排序的代码:#include printf("排序后的数组为:\n");原创 2024-01-02 22:20:49 · 405 阅读 · 0 评论 -
第八章-排序算法
归并排序是一种稳定的排序算法,它使用分治的思想,将待排序序列分成两个子序列,分别进行排序,然后将两个有序子序列合并成一个有序序列,递归地进行这个过程,直到整个序列排序完成。插入排序是一种稳定的排序算法,它将待排序的序列分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的适当位置,直到整个序列排序完成。| 选择排序 | O(n^2) | O(n^2) | O(1) |时间复杂度:平均情况下为O(nlogn),最坏情况下为O(n^2)原创 2024-01-01 13:05:37 · 303 阅读 · 0 评论 -
第七章-查找
树查找的时间复杂度取决于树的高度,平均情况下为O(log n),其中n是树中节点的数量。当需要查找元素时,通过哈希函数计算出目标元素的哈希值,并在哈希表中查找该哈希值对应的位置。哈希查找的平均时间复杂度为O(1),但在最坏情况下可能达到O(n),其中n是数据集的大小。它通过将数据集分成两半并与目标元素进行比较,然后根据比较结果确定目标元素可能存在的区间,不断缩小查找范围直到找到目标元素或确定不存在。线性查找适用于无序数据集,时间复杂度为O(n),其中n是数据集的大小。// 返回目标元素的索引。原创 2024-01-01 12:57:27 · 318 阅读 · 0 评论 -
第六章-图
邻接矩阵是一个二维数组,其中行和列表示图中的节点,矩阵的元素表示节点之间的连接关系。如果节点 i 和节点 j 之间存在边,则矩阵中的元素 matrix[i][j](或 matrix[j][i])为 1 或具体的权重值。邻接表是一种链表的数组,数组的每个元素表示图中的一个节点。BFS 从起始节点开始,逐层地访问节点,先访问起始节点的所有邻居节点,然后再逐层访问邻居节点的邻居节点。普里姆算法从一个起始节点开始,逐步选择与当前生成树连接的权重最小的边,并将其加入生成树中,直到生成树包含图中的所有节点。原创 2024-01-01 12:34:13 · 358 阅读 · 0 评论 -
第五章-树的介绍
树的节点之间存在层次关系,其中一个节点可以有多个子节点,但每个节点只能有一个父节点(除了根节点)。树的顶部节点称为根节点(Root),没有子节点的节点称为叶子节点(Leaf)。在哈夫曼树中,出现频率较高的字符离根节点较近,而出现频率较低的字符离根节点较远,这样可以实现更高效的编码。平衡二叉树是一种特殊的二叉搜索树,它的左右子树的高度差不超过1。二叉树是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。- 左子树中的所有节点的值小于根节点的值。- 右子树中的所有节点的值大于根节点的值。原创 2024-01-01 12:19:16 · 380 阅读 · 0 评论 -
第五章-树
这段代码实现了二叉树的基本操作,包括创建节点、插入节点、删除节点、查找节点以及前序、中序和后序遍历等操作。下面是二叉树的基本操作代码,包括创建二叉树、插入节点、删除节点、查找节点和遍历等操作。// 情况2: 要删除的节点只有右子节点。// 情况3: 要删除的节点只有左子节点。// 情况4: 要删除的节点有左右子节点。// 找到右子树中的最小节点作为替代节点。// 情况1: 要删除的节点为叶子节点。// 如果树为空,创建一个新节点作为根节点。// 递归删除右子树中的替代节点。// 递归删除右子树中的节点。原创 2024-01-01 12:14:13 · 928 阅读 · 0 评论 -
第四章-串
通常,索引从0开始,表示串中的第一个字符,依此类推。这些代码示例展示了使用C语言实现生成串的顺序表和链表的基本操作,并在每个函数中添加了详细的注释,以便理解每个操作的功能和实现细节。// 如果要删除的元素是头节点,将头节点指针指向下一个节点。// 如果要插入的位置是头节点之前,将新节点设置为头节点。// 如果顺序表已满,打印错误信息。// 如果索引无效,打印错误信息。// 如果索引无效,打印错误信息。// 如果索引无效,打印错误信息。// 如果索引无效,打印错误信息。// 如果索引无效,打印错误信息。原创 2024-01-01 12:09:53 · 360 阅读 · 0 评论 -
第三章-栈和队的应用
1. 函数调用和递归:栈常用于函数调用和递归的实现中,每当调用一个函数或递归调用时,相关的信息(如函数参数、返回地址等)会被压入栈中,当函数调用结束时,这些信息会从栈中弹出,控制权返回给上一级函数。4. 浏览器的前进和后退:浏览器的前进和后退功能可以通过两个栈来实现,一个栈用于记录访问的页面,另一个栈用于记录后退的页面。4. 线程池任务调度:线程池中的任务可以使用队列来进行调度,新的任务进入队列等待执行,空闲的线程从队列中获取任务进行处理。原创 2023-12-31 23:22:59 · 382 阅读 · 0 评论 -
第三章-队
队列的顺序表实现使用数组来存储队列元素,使用`front`和`rear`两个指针分别指向队头和队尾。队列的链表实现使用链表来存储队列元素,使用`front`和`rear`两个指针分别指向链表的头部和尾部。每种队列类型都有自己的特点和适用范围,可以根据问题的要求选择最合适的队列类型来实现相应的功能。5. 循环队列(Circular Queue):使用固定大小的数组实现的队列,当队尾到达数组末尾时,可以循环回到数组的开头。1. 普通队列(Queue):最基本的队列类型,按照先进先出的原则进行操作。原创 2023-12-31 23:19:42 · 847 阅读 · 0 评论 -
第三章-栈
栈中存储操作数,当遇到操作符时,从栈中弹出操作数进行相应的计算,并将结果压入栈中,最后栈中剩下的元素即为计算结果。当栈满了之后,可以通过分配更多内存来扩展栈的空间,避免了栈溢出错误。1. 静态栈(Static Stack):静态栈是指栈的大小在创建时已经确定,不能再更改。当栈满了之后,再往栈中插入元素会导致栈溢出错误。需要注意的是,栈的数据结构还有一些变体,例如循环栈、双端栈等,但这些都是基于上述两种基本类型的扩展。- `is_empty`: 判断栈是否为空,返回整数值。- `size`: 返回栈的大小。原创 2023-12-31 23:03:26 · 400 阅读 · 0 评论 -
第二章-线性表
双链表(Doubly Linked List)是一种使用指针实现的线性表,每个节点包含数据元素、指向前一个节点的指针和指向下一个节点的指针。双链表在单链表的基础上增加了对前一个节点的直接访问,可以实现双向遍历,插入和删除操作的效率更高,时间复杂度为O(1)。单链表的插入和删除操作效率较高,时间复杂度为O(1),但访问某个节点需要从头节点开始依次遍历,时间复杂度为O(n)。顺序表适合解决需要频繁访问和随机访问元素的问题,例如按照下标查找元素、插入和删除元素的操作较少的情况。原创 2023-12-31 22:51:25 · 339 阅读 · 0 评论 -
第二章-双链表
这段代码实现了双链表的基本操作,包括初始化双链表 `initList`,判断双链表是否为空 `isEmpty`,在链表头部插入元素 `insertAtHead`,在链表尾部插入元素 `insertAtTail`,在指定位置插入元素 `insertAtPosition`,删除链表中第一个出现的指定元素 `deleteElement`,获取链表长度 `getLength`,打印链表中的元素 `printList`,以及销毁链表,释放内存 `destroyList`。// 删除链表中第一个出现的指定元素。原创 2023-12-31 22:48:54 · 829 阅读 · 0 评论 -
第二章-单链表
这段代码实现了单链表的基本操作,包括初始化单链表 `initList`,判断单链表是否为空 `isEmpty`,在链表头部插入元素 `insertAtHead`,在链表尾部插入元素 `insertAtTail`,在指定位置插入元素 `insertAtPosition`,删除链表中第一个出现的指定元素 `deleteElement`,获取链表长度 `getLength`,打印链表中的元素 `printList`,以及销毁链表,释放内存 `destroyList`。// 删除链表中第一个出现的指定元素。原创 2023-12-31 22:47:43 · 789 阅读 · 0 评论 -
第二章-顺序表
这段代码实现了顺序表的基本操作,包括初始化顺序表 `initList`,判断顺序表是否为空 `isEmpty`,获取顺序表长度 `getLength`,在指定位置插入元素 `insert`,删除指定位置的元素 `delete`,获取指定位置的元素 `getElement`,修改指定位置的元素 `modify`,以及打印顺序表中的元素 `printList`。在 `main` 函数中,我们演示了如何使用这些基本操作来创建顺序表、插入元素、删除元素、获取元素、修改元素,并打印顺序表的内容。原创 2023-12-31 22:46:41 · 808 阅读 · 0 评论 -
第一章-绪论
1. 数据结构的定义和作用:- 数据结构的定义:数据结构是指数据元素之间的关系,以及这些关系在计算机中的表示和操作方式。- 数据结构的作用:数据结构为我们组织和管理数据提供了一种有效的方式,能够提高数据的存储、检索和操作效率。2. 算法的基本概念:- 算法的定义:算法是解决特定问题的一系列有序步骤的描述。- 算法的输入和输出:算法接受输入数据,并产生输出结果。- 算法的正确性:算法必须满足问题的要求,产生正确的输出。- 算法的效率:算法执行所需的时间和空间资源。原创 2023-12-31 22:34:56 · 904 阅读 · 0 评论