![](https://img-blog.csdnimg.cn/a0d774fe6681416ca93842e9473518da.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构学习分享
文章平均质量分 87
本专栏记录了博主学习数据结构整个过程,以及知识点分享。
独享你的盛夏
非科班大二在读,阿里云博客专家,致力于C/C++后端研发。乐于分享成长过程中的芝麻,欢迎相互交流。
展开
-
【八大经典排序算法】快速排序
说到快速排序就不得不提到它的创始人 hoare了。在20世纪50年代,计算机科学家们开始研究如何对数据进行排序,以提高计算机程序的效率。当时,常用的排序算法包括冒泡排序、插入排序和选择排序等。然而,这些算法的效率都相对较低,特别是在处理大量数据时。于是,人们开始寻找更快速的排序算法。Tony Hoare 在研究中发现了一种基于分治思想的排序方法,即快速排序。时间复杂度:O(N*logN)空间复杂度:O(logN)稳定性:不稳定。原创 2023-09-18 16:50:10 · 1590 阅读 · 101 评论 -
【八大经典排序算法】堆排序
堆排序是J.W.J. Williams于1964年提出的。他提出了一种利用堆的数据结构进行排序的算法,并将其称为堆排序。堆排序是基于选择排序的一种改进,通过维护一个堆来选择最大(或最小)的元素,并将其放置在数组的末尾,然后对剩余的元素进行递归调用堆排序。堆排序在其初期的版本中存在一些性能问题,例如在构建堆的过程中需要频繁的调整堆的结构,导致性能的下降。为了改进这个问题,人们提出了一种称为“堆调整”的操作,将调整堆的过程优化为一次遍历,从而提高了性能。原创 2023-09-18 16:49:04 · 1576 阅读 · 37 评论 -
【八大经典排序算法】选择排序
选择排序作为一种简单直观的排序算法,最早由美国计算机科学家 Donald Knuth 在1968年提出。选择排序的思想是将数组分为已排序区间和未排序区间,每次从未排序区间中选择最小(或最大)的元素,将其放到已排序区间的末尾,然后缩小未排序区间的范围,直到未排序区间为空。选择排序的算法复杂度为 O(n^2),并不是一种高效的排序算法,但它的实现简单,不需要额外的空间,因此对于小规模数组的排序还是比较实用的。原创 2023-09-18 16:45:16 · 977 阅读 · 25 评论 -
【八大经典排序算法】冒泡排序
冒泡排序由于其简单和易于理解,使其成为初学者学习排序算法的首选,也是初学者接触到的第一个排序算法。其原理是通过重复交换相邻的元素来将最大的元素逐步“冒泡”到最后。冒泡排序由美国计算机科学家冯·诺伊曼(John von Neumann)于1945年提出。冯·诺伊曼是计算机科学和现代计算机体系结构的奠基人之一,他在设计计算机算法时,意识到排序是计算机科学中的一个基本问题。于是,他提出了冒泡排序算法。冒泡排序的思想是基于比较相邻元素的大小,如果顺序不正确,则交换它们的位置。原创 2023-09-18 16:44:03 · 1416 阅读 · 32 评论 -
直接插入排序、希尔排序详解。及性能比较
元素集合越接近有序,直接插入排序算法的时间效率越高。时间复杂度:O(N^2)。并且是时间复杂度为 N^2的所有算法中最快的排序。空间复杂度:O(1),它是一种稳定的排序算法。希尔排序是对直接插入排序的优化。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。原创 2023-09-10 22:20:38 · 2429 阅读 · 142 评论 -
【数据结构入门指南】二叉树链式结构的实现(保姆级代码思路解读,非常经典)
设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。其他数据结构不同,二叉树的增删查改接口实现的意义不大(后续搜索树的增删查改才有意义)。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。【代码思路】:(核心思想:上一层出时带下一层进队列,即根节点出栈时,根节点的孩子节点入栈)原创 2023-08-26 11:30:44 · 6993 阅读 · 178 评论 -
【数据结构入门指南】二叉树
对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。要注意的是满二叉树是一种特殊的完全二叉树。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。也就是说,如果一个二叉树的层数为K,且结点总数是2^k -1,则它就是满二叉树。④: 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=log。②: 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2。原创 2023-08-22 17:38:30 · 5912 阅读 · 155 评论 -
【数据结构入门指南】二叉树顺序结构: 堆及实现(全程配图,非常经典)
普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。原创 2023-08-21 20:17:19 · 8050 阅读 · 137 评论 -
【二叉树前沿篇】树
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。树的相关概念是通过树和人类亲缘关系来描述的原创 2023-08-19 22:24:30 · 2125 阅读 · 88 评论 -
【数据结构】栈和队列
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的原则。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。栈的实现一般可以使用数组或者链表实现,相对而言。:栈的删除操作叫做出栈。:进行插入操作的一端称为队尾。:进行删除操作的一端称为队头。:一种特殊的线性表,其。原创 2023-08-15 23:53:11 · 2798 阅读 · 131 评论 -
runtime error: member access within misaligned address(力扣最常见错误之一)
力扣最常见报错:runtime error: member access within misaligned address 0xbebebebebebebebe for type 'struct ListNode', which requires 8 byte alignment [ListNode.c]原创 2023-08-14 13:09:19 · 2724 阅读 · 14 评论 -
【数据结构】双链表
双链表在数据结构中有重要的地位,可以用来实现许多其他数据结构和算法,例如栈、队列、哈希表等。它的存在可以提高链表的操作效率,并且可以用于实现其他常用的数据结构和算法。原创 2023-08-08 21:05:57 · 2554 阅读 · 76 评论 -
【数据结构入门指南】单链表
单链表作为其他数据结构的基础,凭借其实用性强,简单常见,非常适合作为数据结构学习的入门。本篇博客将实现单链表增删查改等接口。原创 2023-08-07 14:59:12 · 2928 阅读 · 122 评论 -
数据结构:顺序表详解
顺序表作为一种基本的数据结构,在许多应用场景中具有重要的意义和作用,可以提高数据的访问和操作效率,简化算法设计,提高内存利用率。本篇博客将向你详细介绍其模拟过程及全代码原创 2023-07-30 17:19:35 · 5573 阅读 · 129 评论 -
如何评判算法好坏?复杂度深度解析
近年来互联网大厂对算法的要求越来越高。而复杂度恰好是衡量一个算法好坏的重要指标。同时了解算法复杂度的重要性可以帮助我们选择更优的算法、提高程序性能、节约资源、解决大规模问题、评估算法效果和优化算法设计。本篇博客将详细介绍何为复杂度,让你快速判断一个算法的好坏。原创 2023-07-27 21:50:36 · 1771 阅读 · 34 评论