数据结构
文章平均质量分 81
Skrrapper
C/C++领域创作者、CSDN校园主理人、阿里云专家博主
编程之大,无奇不有。让我们共同学习,一起进步!
展开
-
【数据结构】排序算法系列——外排序(完结篇)
外归并排序是外排序的典型例子,它使用归并排序的思想,执行先排序再归并的操作,从而进行所有数据的排序。外排序通常采用”排序-归并“的策略,在面对海量数据的时候,会将数据分块处理并存储在外部存储的介质例如磁盘上,然后依次将这些数据读入内存并进行排序。另外还有外分配排序,其原理类似于内排序中的。实际上外排序可以看成:将内存作为排序的过渡区间,读入内存主要进行分块数据的排序操作,其他时候数据是放在外部存储介质中进行保存的。:由于涉及大量的读写操作,外排序的性能很大程度上取决于磁盘I/O的效率。原创 2024-11-07 00:13:43 · 397 阅读 · 0 评论 -
【数据结构】排序算法系列——基数排序(附源码+图解)
另一个要注意的是这里是从最后一个数开始存,是因为同一个桶里如果有两个数字 ,那么下面的一个数字在原序列中一定排在上面那个数字的后面,不能够重合。而将递归的操作反过来:从第k关键字到第1关键字顺序进行比较,就可以得到 LSD(Least Significant Digit first)基数排序,不使用递归就可以完成的排序算法。它使用桶来对同一位数的不同大小进行分装,首先进行个位数的排序存放,再进行十位数的排序存放,然后是百位数…,LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。原创 2024-10-13 09:47:10 · 970 阅读 · 0 评论 -
【数据结构】排序算法系列——桶排序(附源码+图解)
作为一种排序算法,它会对每个桶中的数进行排序,然后直接遍历桶,最终就可以按照次序输出数据。对于每一个元素,确定它所属的桶位置的时间是 O(1) 的,总的时间复杂度为 O(n)。总而言之,桶排序在数据分布均匀的情况下效率非常高,但如果数据分布不均匀或者不适合划分到桶中时,可能会退化为更高的复杂度。桶排序(BucketSort),也被叫做箱排序,它将整个数据组分为n个相同大小的子区间,这类子区间或称为。通常,我们会在每个桶内使用一种常规的排序算法(如快速排序或插入排序)来对桶内的元素排序。原创 2024-10-09 10:40:16 · 840 阅读 · 3 评论 -
【数据结构】排序算法系列——计数排序(附源码+图解)
它主要进行的是一个分类的操作,将相同的数分在一类,在进行完分类后,再针对分类出来的代表数进行整体排序。但实际上这样的排序会有一个缺陷——如果相同的数过少,或者说整个数据组的同一性过小,那么实际上分类过程的意义也就会随之变小——从而还是主要依靠排序来进行算法的完成。事实上,它的代码中完全没有输人元素之间的比较操作。计数排序的一个重要性质就是它是稳定的:具有相同值的元素在输出数组中的相对次序与它们在输人数组中的相对次序相同。也就是说,对两个相同的数来说,在输入数组中先出现的数,在输出数组中也位于前面。原创 2024-09-28 08:18:15 · 467 阅读 · 4 评论 -
【数据结构】排序算法系列——归并排序(附源码+图解)
它的特点在于并不是一开始就将整个数组进行归类和调整,而是以一定的间隔数分成多次小的排序,最后再逐渐将小的排序的范围变大,最后变大到整个数组时,已经完全有序。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。界定比较的数据个数:一般按照2的倍数增长:两个互相比较、四个互相比较、八个互相比较…总的来说,分治法也可以被称作一种算法,它是一种基于递归的、“分而治之”的算法思想。3.合并这些子问题的解成原问题的解。原创 2024-09-24 23:16:04 · 2135 阅读 · 0 评论 -
【数据结构】排序算法系列——快速排序(附源码+图解)
接下来我们将要介绍的是排序中最为重要的算法之一——快速排序。快速排序(英语:Quicksort),又称分区交换排序(partition-exchange sort),最早由东尼·霍尔提出。快速排序通常明显比其他算法更快,因为它的内部循环可以在大部分的架构上很有效率地达成。我们直接来分析它的算法思想。我们首先直接来看算法步骤,再分析其原理和目的具体的动画分析可以看这:快速排序算法动画演示_哔哩哔哩_bilibili我们首先来对基准值的选择进行分析:通常我们都会选择最左边或者最右边的基准值,这是最不需要多想的选原创 2024-09-18 18:05:43 · 1809 阅读 · 0 评论 -
【数据结构】排序算法系列——堆排序(附源码+图解)
但是当我们根据[[二叉树]]的遍历来进行输出时,会发现同一个父节点的子节点之间以及其中一个子节点的子节点实际上是无序的,例如60和10,它们之间是大于的关系;),然后重新构造堆,那么此时的第二个根节点就仅次于第一个根节点的大小,这么以此类推,最终将所有节点根据大、次大、第三大的顺序排序在数组中,那么也就成功构建出了有序的数组。根据堆的有序性和完全二叉树的性质,我们得知将其用在排序上是可行的,并且还能够有效减少重复比较的次数,这何乐而不为呢?可惜的是,这样的操作并没有把每一趟的比较结果保存下来,原创 2024-09-14 14:05:07 · 701 阅读 · 1 评论 -
【数据结构】排序算法系列——冒泡排序(附源码+图解)
冒泡排序(Bubble sort)的算法思想也是较为容易去理解的,我们参照冒泡这一物理现象,会发现,往往大的气泡都会往上运动,而小的气泡往往都在下方。冒泡排序的名字也就是这么由来的。它在数据较少或者较为有序的时候,可以有很好的效率,但是一旦数据多起来或者较为无序,那么需要重复的次数就会大幅度增加,从而后期乏力,效率降低。接下来我们要介绍的是排序算法中极为标志性,并且经常在教材中作为经典案例出现的——冒泡排序。在序列完全有序时,冒泡排序只需遍历一遍数组,不用执行任何交换操作,时间复杂度为。原创 2024-09-11 10:30:58 · 1203 阅读 · 0 评论 -
【数据结构】排序算法系列——选择排序(附源码+图解)
选择排序的思想与插入排序其实有异曲同工之处,它们都会对数据进行比较和交换,但是它们也还是有很大的差别:插入排序是两两元素之间进行比较,而选择排序是将最值的元素同其他元素依次进行比较,从而按照最大(或最小)、第二大、第三大这样的顺序进行数组的重组。选择排序的最优时间复杂度、平均时间复杂度和最坏时间复杂度均为。原创 2024-09-09 08:09:25 · 621 阅读 · 4 评论 -
【数据结构】排序算法系列——希尔排序(附源码+图解)
希尔排序实际上是个相当复杂的排序算法,这主要是跟它的步长序列gap到底该如何取、后续应该减小有关。时,数组已经接近有序的了,就整体而言,最后一次整体的插入排序就可以大大提高效率——我们从插入排序的时间复杂度分析也可以看出,可以看到每次减小gap的规律是将原先的gap/2,但事实上这只是其中一种处理方法,并不说明这是最优解。,使得平均情况下的时间复杂度能够在O(n^1.3)左右,而不好的选择则可能导致接近最坏情况的性能。中,我们会将整体数据一分为多份,进行散布式的插入排序,这时候每一个子序列之间的间隙就是。原创 2024-09-07 09:36:10 · 1575 阅读 · 52 评论 -
【数据结构】排序算法系列——插入排序(附源码+图解)
我们看图解中,单次比较过程中,拿出来比较的数只会同它左侧的数进行比较,而被比较的数随着比较结束也会根据具体情况向后移动或者是进行交换,向后移动的过程也称为——补位。在全程的比较中,随着补位和交换的进行,进行比较操作的数只会与曾经进行过比较操作的数进行比较——简单来说,就是比较与被比较是交替进行的。我们总结插入排序算法的核心思路——插入排序的算法思想其实很容易理解,它秉持着一个不变的循环:比较->交换->比较->交换…插入排序的最坏时间复杂度和平均时间复杂度都为。插入排序的最优时间复杂度为。原创 2024-09-05 16:57:35 · 517 阅读 · 4 评论 -
【数据结构】排序算法系列——序言(附源码+图解)
在《算法导论》这本经典的算法学习中,我们可以看到“排序”二字的出现频率极高,更是直接拿出一整章节来对其中的快速排序、堆排序等进行讲解。了解一种算法的重要程度,我们可以直接在这本书中所占的权重来粗略得知。在维基百科中,对排序算法的解释是这样的。排序算法(英语:Sorting algorithm)是一种将一组特定的数据按某种顺序进行排列的算法。简单来说,就是将一堆杂乱的数据处理成有序的数据。我们在进行排序的时候必须遵循两个原则:输出的结果一般是递增或者是递减序列,这里的递增递减既可以代表着“有序”二字;原创 2024-09-04 17:33:50 · 990 阅读 · 45 评论 -
【数据结构】非线性表----二叉树详解
递归,其中函数在其定义的过程中调用自身。递归基(Base Case)这是停止递归调用的条件。当满足某个条件时,函数返回一个结果,而不再进行进一步的递归调用。递归步骤(Recursive Step)这是函数如何将问题分解成更小的子问题的部分。函数调用自身来处理这些子问题,并通常会将结果合并以生成最终结果。}BTNode;原创 2024-08-03 19:45:09 · 1148 阅读 · 0 评论 -
【数据结构】非线性表----树详解
单纯的树实际上用处不大(子节点过多)。但是对于文件系统、目录以及某些分层过多的系统,使用的就是树。通常在优化的数据结构中,使用更多的是叫做二叉树的数据结构这是基于树的数据结构,一个根节点只有两个孩子结点,在下一节我们将会对二叉树进行剖析,敬请期待。原创 2024-07-15 11:39:43 · 1349 阅读 · 17 评论 -
【数据结构】线性表----队列详解
队列作为一种重要的数据结构,具有简单但实用的特性。在本文中,我们介绍了队列的基本概念、实现方法、常见操作、实际应用以及使用时需要注意的问题。通过实践代码示例,相信读者能更好地理解和掌握队列的使用。队列在编程中的应用广泛,相信掌握了它将为你的编程技能打下坚实的基础。原创 2024-07-11 10:18:37 · 1527 阅读 · 9 评论 -
【数据结构】线性表----栈详解
栈(Stack)是一种常见的数据结构,它具有**后进先出(Last In, First Out, LIFO)**的特点。栈的运作类似于物理世界中的叠盘子:最新放上去的盘子最先被拿走,而最底部的盘子最后才能被取出。如果你先拿底下的盘子,那么就有可能出现整个盘子组全部倒塌碎落一地——这也就是所谓的栈出错。栈有着的特点。所以它的出栈和入栈也遵循着这个特点。我们在存取元素的时候,一般是在进行——也就是所谓的盘子顶;而另一端称为,一般就是数据结构的头结点。入栈出栈的顺序只需记住:顺序必须有规律,例如。原创 2024-07-08 16:25:47 · 1417 阅读 · 5 评论 -
【数据结构】链表----头结点的作用
链表是一种常见的数据结构,由一系列节点(Node)组成,每个节点包含数据和指向下一个节点的指针。链表的。原创 2024-06-04 07:14:56 · 1403 阅读 · 24 评论 -
【数据结构】复杂度的重要性—–决定程序运行的效率
在我们写算法的时候,常常会需要考虑一个问题:这个算法好不好?而这个“好”实际上就取决于是算法的复杂度。算法复杂度)是指算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源。应用于数学和计算机导论。我们知道,同一个问题可以使用不同的算法来解决,而这里的不同一般来说也是可以从复杂度来看出的,当然,也不排除有相同复杂度但不同写法的算法,这里只作参考。一个算法的好坏影响到了很多实际性的问题,在程序中效率是极其重要的,一个算法的评价主要从时间复杂度和空间复杂度来考虑。原创 2024-06-03 10:20:04 · 2095 阅读 · 95 评论 -
【数据结构】链表--双向链表
双向链表每个元素都是一个对象,每个对象包括一个数据域和两个指针域next和prev。我们知道,单链表可以从后往前轻松的前进,但是它很难实现后退。它一般只能从头到尾或者从尾到头。那么当我们需要实现更加灵活的操作时,就可以使用双向链表:拥有两个指针域,一个指向前驱节点,一个指向后继节点,在操作时既可以前进也可以后退,灵活性大大提高。双向链表的操作普遍上比单向链表简单,因为它多了一个指针域所以操作的灵活性大大提高。如果头指针指向自己,那么此时的链表就自然是一个空表,完成双向链表的初始化。原创 2024-05-21 11:01:10 · 980 阅读 · 27 评论 -
【数据结构】线性表----链表详解
前面我们介绍的顺序表,在逻辑结构和物理结构上都是线性、连续的关系,那么我们在篇尾的时候也提到了是否有一种顺序表,无需在物理结构上连续,从而达到更好存取的目的呢?今天它来了。链表(LinkList)属于线性表的一种,以下是百度百科关于链表的定义:在结构上链表数据域指针域。我们可以类比成火车,火车每一节车厢实际上是独立的,也就好比数据域,存储着各自的数据;但每一节车厢之间都会由一条链连接在一起,从而形成整个火车,链也就好比指针域,起到连接该车厢和指向下一车厢的作用。而实际上这样的存储结构也就是为什么。原创 2024-05-14 09:38:58 · 1232 阅读 · 8 评论 -
【数据结构】----顺序表项目-通讯录
顺序表的底层是—决定了其作为的特性—从简单的顺序表变成通讯录通讯录中不同的数据构成了一个,例如包含联系人的数据:姓名,性别,电话,家庭住址,年龄…诸如此类。而我们针对这些通讯录中的数据进行一系列的操作,例如。然而这些操作实际上已经在顺序表中实现好,我们只需要直接更改函数的名称并且直接调用即可,或者是直接调用已有的函数放在通讯录的操作函数中直接实现。原创 2024-05-03 11:24:41 · 929 阅读 · 0 评论 -
【数据结构】线性表----顺序表详解
顺序表(SeqList)属于线性表的同一种,它同样具有线性的存储结构,以下是百度百科关于顺序表的定义:总结下来,在结构上顺序表实际上的底层结构就是数组,而顺序表本身也就是对一个数组的封装以及修饰;在元素上顺序表实际上就是元素之间逻辑关系和物理关系一致的一种线性表,与其对应的是链表(后续会谈及)。下面针对这两个方面具体解释什么是顺序表。结构上顺序表的底层结构通常是通过数组来实现的。数组是一种连续存储数据元素的数据结构,可以通过下标来访问数组中的元素。在顺序表中,原创 2024-05-01 16:51:35 · 1014 阅读 · 3 评论