数据结构
文章平均质量分 78
数据结构学习
gsfl
这个作者很懒,什么都没留下…
展开
-
排序——计数排序
计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。[1] 当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(n。log(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(n。使最小数据和0下标对应,其他数据-最小数据=该数据对应下标。要排序的数字是多少,对应存放的下标就是多少。原创 2024-01-15 22:54:38 · 501 阅读 · 0 评论 -
二叉树前,中序推后续_中,后续推前序
二叉树是由根、左子树、右子树三部分组成。二叉树的遍历方式又可以分为前序遍历,中序遍历,后序遍历。前序遍历:根,左子树,右子树中序遍历:左子树,根,右子树后序遍历:左子树,右子树,根比如定义一棵树:它的前序遍历结果为:1 2 3 4 5 6中序遍历结果为:3 2 1 5 4 6后序遍历结果为:3 2 5 6 4 1现在如果我们没有二叉树的图,只知道它的两种遍历的结果,如何求第三种遍历的结果呢?原创 2023-12-17 19:15:49 · 1299 阅读 · 3 评论 -
排序——归并排序
代表序列的数据个数,首先让gap等于1,这样就将序列分解为好了,然后开始两两归并,之后让gap不断2倍化,直到gap等于原数组的数据个数。递归版本时,我们通过将要排序的序列分解、合并,在合并的过程中完成排序。在非递归的版本中,合并的思路和代码实现是一样,主要是如何将序列分解,递归版本可以利用子问题分治实现,非递归就要用循环模拟递归,我们这里引入一个gap。过程:我们需要创建一个临时数组tmp,将每次归并后的结果存入tmp,最后用memcpy将排好后的tmp的数据拷贝到原数组中。原创 2024-01-15 17:36:42 · 540 阅读 · 0 评论 -
直接插入排序_希尔排序
排序算法的稳定性的定义:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,A1=A2,且A1在A2之前,而在排序后的序列中,A1仍在A2之前,则称这种排序算法是稳定的;当用直接插入的升序排序去排一个降序的数组时,每个未排序的数x都要遍历完前面所有有序的数才能找到正确的位置,此时时间复杂度最大,为n^2。,一般为序列长度的一半)然后进行直接插入排序,之后增量取原增量的一半,进行插入排序,直到增量为1时,序列接近有序,再进行一次直接插入排序。原创 2023-12-17 00:57:12 · 1035 阅读 · 3 评论 -
建堆的时间复杂度和堆排序
排序可以分为升序排序和降序排序,实现堆排序前,我们先要思考,升序和降序哪种适合大堆,哪种适合小堆?假如我们现在要实现升序排序,我们可以先用小堆理一遍思路,小堆结构是堆顶元素最小,如果我们直接把堆顶拿出来,那么下面父子兄弟节点的关系全乱了,最差的情况需要把每个节点都向上调整一遍,时间复杂度太高。如果选择大堆,我们只需把每次堆顶的元素和堆中最后一个元素交换,然后让新的堆顶向下调整,(每次交换完后最后的元素不参与后续的向下调整)就能得到一个升序的数组。因此,利用向下调整建堆的的时间复杂度为O(N)。原创 2023-12-01 00:07:53 · 831 阅读 · 4 评论 -
top - k问题
int size;}HP;原创 2023-11-29 17:34:04 · 410 阅读 · 4 评论 -
链表的实现
SLNode;在单链表的节点的结构中我们需要一个指向下一节点的指针next,和存数据的val,这里用结构体实现,最后一个节点中的指针存NULL。原创 2023-11-15 15:10:00 · 64 阅读 · 1 评论 -
时间复杂度和空间复杂度
算法效率:如何衡量一个算法的好坏呢?算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。复杂度的计算不能只看循环,重要的是代码的思路,先根据思想判断时间复杂度,再选择最优的代码。至此本篇文章就结束了。创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!如果本篇博客有任何错误,请批评指教,不胜感激!!!原创 2023-10-28 13:11:10 · 100 阅读 · 14 评论 -
二叉堆的实现
有图可以看出56和30是70的第一,第二孩子,我们很容易得到他们的下标关系,孩子1的下标是父节点下标的2倍+1,孩子2的下标是父节点下标的2倍+2。大堆中向下调整是和子节点中大的值交换,一开始我们不知道哪个子节点是更大的,所以不妨假设第一个子节点最大,如果假设不成立就让子节点++,变成第二子节点。这里实现的是大堆(根节点最大)的向上调整,swap函数对要调整的两值进行交换,首先我们要知道在二叉堆中子节点和父节点的关系。接下来看看我们实现的大堆的效果,第一行是打印堆的元素,第二是利用堆来排序。原创 2023-11-28 00:05:39 · 1227 阅读 · 2 评论 -
栈和队列的实现
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。,相对而言数组的结构实现更优一些。栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。压栈:栈的插入操作叫做进栈/压栈/入栈,出栈:栈的删除操作叫做出栈。原创 2023-11-18 15:16:47 · 119 阅读 · 3 评论 -
顺序表的实现
顺序表在现实中有许多应用场景。例如,可以用来存储学生成绩信息,每个学生的成绩用一个结构体来表示,然后将每个学生的信息按照学号的顺序存储在顺序表中,这样可以方便地进行查找、排序和统计操作。另外,顺序表也可以用来实现图书馆借阅管理系统中的图书链表,每个节点存储一本书的相关信息,如书名、作者、出版日期等。借阅书籍时,可以通过链表的操作实现借书和还书的功能。原创 2023-11-03 18:17:27 · 88 阅读 · 12 评论 -
树,二叉树
这里我们把空节点的值当作N,便于更加清楚前序遍历的逻辑,如果是空节点就打印N并结束当前函数,如果不是空节点就先打印节点的数据,再进入当前节点的左孩子节点,此时进入递归的第二层,如果该节点不为空,就先打印当前节点的值,然后当前节点的左孩子节点,也就是第三层递归。根据递归分治法,根据叶子节点的特点,我们能知道当当前节点的左右孩子都为空时,当前节点就是叶子节点,于是返回1,如果还不是叶子节点就继续检验左右孩子节点。:以某节点为根的子树中任一节点都称为该节点的子孙。:一个节点含有的子树的根节点称为该节点的子节点。原创 2023-11-29 00:31:09 · 1316 阅读 · 5 评论