数据结构从入门到精通
文章平均质量分 95
数据结构是计算机科学中研究如何组织、存储和操作数据的重要分支。它关注数据的逻辑结构和物理结构,以及相应的数据操作算法。逻辑结构包括线性结构(如数组、链表)、树形结构(如二叉树、堆)和图形结构(如网、图)等。
鲜于言悠905
商务合作(微信:f1985954492 邮箱:1985954492@qq.com),阿里云专家博主,主要学习c/c++方向,也会了解一些JAVA,Python-数据分析
展开
-
Java实现链表
链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的一个显著特点是,它不需要在内存中连续存储,因此可以高效地插入和删除节点。这种灵活性使得链表在许多应用中成为理想的选择,尤其是在需要动态调整数据结构大小的场景中。在链表的实现中,通常会有头节点和尾节点之分。头节点是链表的第一个节点,而尾节点是链表的最后一个节点。通过遍历链表,我们可以访问链表中存储的所有数据。链表还支持在链表头部或尾部快速添加新节点,这些操作的时间复杂度通常为O(1)。然而,链表也有一些缺点。原创 2024-05-28 07:00:00 · 820 阅读 · 7 评论 -
Java实现顺序表
Java顺序表是Java中实现线性表结构的一种方式,它采用数组来存储元素,通过下标访问元素,具有快速访问和修改特定位置元素的特点,但插入和删除操作可能涉及较多元素的移动。线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。线性表是一种数据结构,由一组有序的元素组成,元素之间具有线性关系。原创 2024-05-30 20:55:27 · 152 阅读 · 6 评论 -
C语言实现归并排序
归并排序是一种分治策略的排序算法。它将一个序列分为两个等长(几乎等长)的子序列,分别对子序列进行排序,然后将排序结果合并起来,得到完全有序的序列。这个过程递归进行,直到整个序列有序。归并排序的时间复杂度为O(nlogn),空间复杂度为O(n)。归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。时间复杂度:O(N*logN)空间复杂度:O(N)稳定性:稳定归并排序的特性总结起来主要有四点:稳定性、时间复杂度、空间复杂度和递归性。首先是稳定性。原创 2024-03-26 17:18:09 · 1588 阅读 · 62 评论 -
通过C语言实现三种版本的快速排序
快速排序是一种高效的排序算法,通过选取一个“基准”元素,将数组分为两部分:比基准小的元素和比基准大的元素,然后递归地对这两部分进行排序,从而实现对整个数组的排序。该算法平均时间复杂度为O(nlogn),最坏情况下为O(n²),但由于实际应用中很少出现最坏情况,因此快速排序仍然是一种广泛使用的排序算法。快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序时间复杂度:O(N*logN)空间复杂度:O(logN)稳定性:不稳定。原创 2024-03-23 13:28:50 · 1823 阅读 · 48 评论 -
C语言实现冒泡排序
冒泡排序是一种简单的排序算法,通过重复遍历待排序数列,比较相邻元素的大小并交换位置,使得每一轮遍历后最大(或最小)的元素都会“冒泡”到数列的一端,直到整个数列有序。这种算法的时间复杂度较高,但在处理小规模数据或近乎有序的数据时表现良好,除此之外,与其他排序算法相比,冒泡排序更适用于教学而不适应于实际生活冒泡排序是一种非常容易理解的排序时间复杂度:O(N^2)空间复杂度:O(1)稳定性:稳定。原创 2024-03-21 12:15:00 · 948 阅读 · 14 评论 -
C语言实现堆排序
堆排序是一种利用堆数据结构实现的排序算法。首先,它将待排序的数组构建成一个大顶堆或小顶堆。然后,通过不断将堆顶元素(最大或最小)与末尾元素交换并重新调整堆,使得数组逐渐有序。最后,当堆的大小减至1时,排序完成。堆排序的时间复杂度为O(nlogn),空间复杂度为O(1),具有稳定性和适用性广的优点。堆排序使用堆来选数,效率就高了很多。时间复杂度:O(N*logN)空间复杂度:O(1)稳定性:不稳定。原创 2024-03-21 07:52:35 · 1122 阅读 · 8 评论 -
C语言实现直接选择排序
直接选择排序是一种简单的排序算法。它的工作原理是每一次从未排序部分选出最小(或最大)的一个元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。这种算法的时间复杂度为O(n^2),其中n是待排序元素的数量,因此在处理大数据集时效率较低。然而,它的实现简单,对于小规模的数据排序是一个不错的选择。直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用时间复杂度:O(N^2)空间复杂度:O(1)原创 2024-03-20 16:36:08 · 1021 阅读 · 9 评论 -
C语言实现希尔排序
希尔排序是一种基于插入排序的算法,通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。这种算法交换操作结合了直接插入排序和分组交换的思想,交换操作和移动操作相结合,相比于直接插入排序,希尔排序交换操作和移动操作相结合,效率更高。希尔排序是非稳定排序算法。希尔排序是对直接插入排序的优化。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。原创 2024-03-20 13:15:46 · 1227 阅读 · 12 评论 -
C语言实现直接插入排序
直接插入排序是一种简单的排序算法,其工作原理是逐个将待排序元素插入到已排序序列中的适当位置,直到全部元素排序完毕。算法从第二个元素开始,将其与前面的元素进行比较,如果当前元素小于前一个元素,则将其插入到前一个元素之前,否则继续向前比较。重复此过程,直到当前元素找到合适的插入位置。每次插入一个元素后,已排序序列的长度增加1,直到整个序列排序完成。直接插入排序的时间复杂度为O(n^2),在数据量较小时效率较高,但在大规模数据排序中性能不佳。原创 2024-03-19 18:50:33 · 1622 阅读 · 19 评论 -
排序的概念及运用
排序是将数据按照一定规则重新排列的过程,常见规则有升序、降序等。排序算法如冒泡排序、快速排序等,广泛用于数据库、搜索引擎等场景,提高数据检索效率。此外,排序也应用于统计分析、机器学习等领域,以获取有序数据集或发现数据间的关联。排序是一种将一组数据按照一定的规则重新排列的操作。通常,排序的目标是将数据按照某种顺序进行排列,比如按照升序或降序排列。排序算法是对数据进行排序的具体步骤和方法。排序算法在计算机科学和数据结构中具有广泛的应用。在实际生活中,排序也随处可见。原创 2024-03-19 15:09:47 · 1201 阅读 · 34 评论 -
二叉树的实现
二叉树是一种常见的数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。实现二叉树通常涉及定义节点类(包含数据和指向子节点的指针)以及相应的插入、删除和查找操作。遍历二叉树则是访问其所有节点的过程,常见的遍历方式有前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根)。这些遍历方法可以递归或迭代实现,对于理解二叉树结构和操作非常重要。原创 2024-03-18 18:55:58 · 1785 阅读 · 45 评论 -
C语言实现堆
堆是一种特殊的树形数据结构,具有完全二叉树的特性。在堆中,父节点的值总是大于或等于(大顶堆)或小于或等于(小顶堆)其子节点的值。堆通常用于实现优先队列,其中每个元素都有一个优先级,优先级最高的元素总是位于堆的根节点。堆的插入和删除操作的时间复杂度都是O(log n),因此堆是一种高效的数据结构。此外,堆还可以用于实现内存管理,例如垃圾回收和内存分配等。原创 2024-03-14 16:19:19 · 1882 阅读 · 64 评论 -
通过一篇文章让你了解什么是函数栈帧
函数栈帧的创建和销毁是程序执行过程中的核心环节,它们直接影响了程序的运行效率和内存管理。在深入探讨这两个过程之前,我们需要先理解什么是函数栈帧。函数栈帧,也可以称为函数调用栈帧,是计算机在执行函数时为其分配的一块内存区域。每当一个函数被调用时,一个新的栈帧就会被创建并压入调用栈中。这个栈帧包含了函数的局部变量、参数、返回地址等信息,为函数的执行提供了必要的环境。函数栈帧的创建当函数被调用时,操作系统或运行时环境会为其创建一个新的栈帧。分配内存:根据函数的需求,在调用栈上分配一块足够大的内存区域。原创 2024-03-13 12:53:32 · 1087 阅读 · 34 评论 -
C语言实现队列
队列是一种特殊的线性数据结构,遵循先入先出(FIFO)的原则。它只允许在队列的末尾添加元素(称为入队操作),并从队列的开头移除元素(称为出队操作)。队列在多种应用中发挥着重要作用,如计算机系统的任务调度、打印机作业管理以及多线程编程中的线程同步等。原创 2024-03-09 19:47:31 · 1724 阅读 · 37 评论 -
C语言实现栈
栈,作为一种后进先出(LIFO)的数据结构,在计算机科学中扮演着重要的角色。它的特性使得它在处理函数调用、括号匹配、表达式求值等问题时具有得天独厚的优势。然而,如果我们跳出传统思维的束缚,会发现栈的用途远不止于此。在现代软件开发中,栈的概念被广泛应用在内存管理、并发控制等多个领域。以内存管理为例,每个线程都有自己的栈空间,用于存储局部变量和函数调用信息。这种隔离保证了线程之间的数据安全,避免了数据混乱和意外覆盖。同样,在并发控制中,栈也发挥着不可替代的作用。原创 2024-03-08 17:00:49 · 1497 阅读 · 32 评论 -
基于C语言和Win32 API实现贪吃蛇
游戏初始化:设置游戏窗口大小、颜色、速度等参数,并初始化蛇的长度和位置。游戏循环:在一个无限循环中,不断更新游戏状态,包括蛇的移动、食物的生成和碰撞检测等。蛇的移动:根据用户的输入(通常是方向键),控制蛇的头部向相应方向移动,并更新蛇的身体位置。食物的生成:在游戏区域内随机生成食物,并标记其位置。碰撞检测:检测蛇是否吃到食物、是否碰到游戏边界或自己的身体。游戏结束条件:如果蛇碰到游戏边界或自己的身体,游戏结束,显示游戏结束画面。渲染画面。原创 2024-05-15 14:45:34 · 22007 阅读 · 65 评论 -
C语言实现链表
链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的一个显著特点是,它不需要在内存中连续存储,因此可以高效地插入和删除节点。这种灵活性使得链表在许多应用中成为理想的选择,尤其是在需要动态调整数据结构大小的场景中。在链表的实现中,通常会有头节点和尾节点之分。头节点是链表的第一个节点,而尾节点是链表的最后一个节点。通过遍历链表,我们可以访问链表中存储的所有数据。链表还支持在链表头部或尾部快速添加新节点,这些操作的时间复杂度通常为O(1)。然而,链表也有一些缺点。原创 2024-03-04 20:55:37 · 1412 阅读 · 31 评论 -
数据结构项目实战——通讯录
C语言通讯录是一个使用C语言编写的简单程序,用于存储和管理联系人信息。该程序允许用户添加、删除、查找和显示通讯录中的联系人。每个联系人通常包括姓名、电话号码和电子邮件地址等基本信息。程序使用结构体来存储联系人信息,并使用数组或链表等数据结构来组织和管理通讯录。通过命令行界面与用户进行交互,用户可以通过输入命令来执行相应的操作。C语言通讯录程序可以用于个人或小型组织的信息管理,提高联系人信息的管理效率。#include //使用断言所需的头文件1。原创 2024-03-02 16:50:12 · 1721 阅读 · 28 评论 -
C语言实现顺序表
顺序表是一种常见的线性数据结构,它使用一段连续的存储单元依次存储数据元素。这种数据结构的特点是逻辑上相邻的元素在物理存储位置上也相邻,因此可以快速地访问表中的任意元素。顺序表的实现通常依赖于数组,数组是一种静态的数据结构,一旦创建,其大小就是固定的。这意味着在顺序表中插入或删除元素可能会导致空间的浪费或不足。例如,如果在一个已经满了的顺序表中插入一个新元素,就需要重新分配更大的数组空间,并将原有元素复制到新数组中,这是一个相对耗时的操作。然而,顺序表在访问元素时具有很高的效率。原创 2024-03-02 13:58:04 · 1477 阅读 · 21 评论 -
算法的时间复杂度和空间复杂度
算法的时间复杂度和空间复杂度是评估算法性能的两个重要指标。时间复杂度主要关注算法执行过程中所需的时间随输入规模的变化情况,而空间复杂度则关注算法执行过程中所需的最大存储空间或内存空间。对于时间复杂度,它通常表示为一个大O表示法,如O(n)O(n^2)O(log n)等,其中n代表输入规模的大小。一个优秀的算法应该具有较低的时间复杂度,这意味着当输入规模增大时,算法的执行时间增长不会过快。例如,线性时间复杂度O(n)的算法在处理大规模数据时比二次时间复杂度O(n^2)的算法更加高效。原创 2024-03-01 18:17:13 · 1546 阅读 · 20 评论 -
通过一篇文章让你了解数据结构和算法的重要性
数据结构和算法的重要性,不仅仅在于它们在计算机科学领域中的核心地位,更在于它们对于解决实际问题、优化系统性能、提升软件开发效率等方面的深远影响。在现代信息技术的浪潮中,数据结构和算法如同计算机的“灵魂”,指导着信息的有序存储和高效处理。数据结构是信息存储和组织的基础。一个合理的数据结构能够使得数据访问、插入和删除等操作变得快速而准确。比如,在需要频繁查找操作的场景中,使用哈希表(Hash Table)或二叉搜索树(Binary Search Tree)等高效数据结构,可以显著减少查找时间,提高程序性能。原创 2024-03-01 15:29:32 · 1817 阅读 · 20 评论