数据结构
文章平均质量分 82
平凡的指针
这个作者很懒,什么都没留下…
展开
-
【数据结构初阶之插入排序】:插入排序和希尔排序
文章目录插入排序直接插入排序希尔排序插入排序插入排序,是一种简单的插入排序方法,它的基本思想是:把待排序的记录按其关键值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。插入排序最简单的就是直接插入排序,而对插入排序的优化就有了希尔排序,下面我们分别来分析。直接插入排序直接插入排序在其实现过程使用双层循环,外层循环控制有序序列的最后一个下标,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。我们先分析把一个元素插入到有序数组的过程,图片如下:原创 2021-12-02 23:48:26 · 1816 阅读 · 2 评论 -
【数据结构初阶之归并排序】:归并排序的递归和非递归实现(用C语言实现,附图分析)
文章目录归并排序递归实现归并排序非递归实现归并排序归并排序归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。递归实现归并排序根据归并排序的思想我们可以采用分而治之,即用递归来解决,把问题不断分割成子问题,分割到不可分割为止。而递归实现归并排序类似于二叉树的后序遍历,我们需要原创 2021-12-01 23:21:37 · 347 阅读 · 6 评论 -
【数据结构初阶之快速排序】:快速排序的实现和优化(用C语言实现,附图详解)
文章目录一、递归实现快速排序1.左右哨兵法2.挖坑法3.前后指针法二、对快速排序的优化1.三数取中法2.减少递归的深度三、非递归实现快速排序一、递归实现快速排序快速排序简称快排,快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。根据上面的快速排序思想我们就有了三个原创 2021-11-29 22:39:01 · 884 阅读 · 6 评论 -
【数据结构初阶之二叉树】:二叉树相关的性质和经典的习题(用C语言实现,附图详解)
文章目录一、树的概念及结构1.树的概念2.树当中相关的概念3. 树的表示二、二叉树的概念及结构1.二叉树的概念2.特殊的二叉树3.二叉树的性质4.二叉树的存储结构三、二叉树链式结构的实现1.二叉树的创建2.二叉树的前序遍历3.二叉树的中序遍历4.二叉树的后序遍历一、树的概念及结构1.树的概念在数据结构中什么是树呢?我们有如下定义和性质:定义: 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝.原创 2021-11-22 19:49:01 · 1546 阅读 · 7 评论 -
【数据结构初阶】:堆的接口实现和堆排序
文章目录堆的实现一、堆的概念及结构二、堆的实现思路三、堆的各种接口:1.堆的初始化和销毁2.堆的插入3.堆的删除4.打印堆的数据和获取堆顶的元素5.获取堆的元素个数和判空堆排序1.向上调整建堆2.向下调整建堆3.建堆后的堆排序4.建堆的时间复杂度证明堆的实现一、堆的概念及结构堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。(kik_{i}ki <= k2i原创 2021-11-15 19:55:16 · 774 阅读 · 2 评论 -
【LeetCode之栈和队列】:关于栈和队列经典的OJ题(用C语言实现,附图详解)
LeetCode题目1、括号匹配问题2、用队列实现栈3、用栈实现队列4、设计循环队列1、括号匹配问题LeetCode链接: 【20. 有效的括号】这道题就是经典的利用栈解决问题的例子;思路如下:遍历一遍字符串,如果遇倒左括号就入栈,如果遇倒右括号取栈顶的元素进行匹配并出栈顶的元素,如果相匹配就继续,不匹配就返回false。但是要注意这样只能检验出左右括号相等的情况下才可以,如果左右括号不相等呢?如果左括号多于右括号,并且遍历结束后它们都是匹配的,这种情况并不是完全匹配的,因为栈里还有元素剩余原创 2021-11-04 22:37:53 · 581 阅读 · 4 评论 -
【数据结构初阶】:栈和队列的实现(用C语言实现,附图详解和附源码)
文章目录栈的实现:一、栈的概念和性质二、栈的实现思路三、栈的相关变量内存布局图四、栈的初始化和销毁五、栈的接口实现:1.入栈2.出栈3.获取栈顶的数据4.获取栈的元素个数5.判断栈是否为空队列的实现:一、队列的概念和性质二、队列的实现思路三、队列相关变量的内存布局图四、队列的初始化和销毁五、队列的接口实现:1. 入数据2.出数据3.取队头数据4.取队尾数据5.获取队列元素个数6.判断队列是否为空总结栈的实现:一、栈的概念和性质栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在固定的一端进行插原创 2021-11-01 23:29:00 · 1185 阅读 · 6 评论 -
【LeetCode之链表】:经典的快慢指针相关问题
LeetCode题目1. 返回链表的中间结点2. 输出该链表中倒数第k个结点3. 链表的回文结构1. 返回链表的中间结点LeetCode链接: 【链表的中间结点】思路1: 最容易想到的思路是先统计整个链表的结点个数,然后就可以得出中间结点的位置是在第几个,最后再从头结点走到中间结点位置即可。代码实现如下:struct ListNode* middleNode(struct ListNode* head){ int count=0; struct ListNode* cur=hea原创 2021-10-31 11:44:19 · 229 阅读 · 1 评论 -
【LeetCode之链表】:移除链表元素 和 反转链表(用C语言实现,附图详解)
LeetCode题目1.移除链表元素2.反转链表1.移除链表元素LeetCode链接: 【203. 移除链表元素】这个题目和单链表的增删查改接口很相似,要我们删除链表中的元素。要注意题目给我们的是无头单向不循环链表,是没有哨兵位结点的,所以删除的元素有两种情况:1.可能在链表的头结点2.可能在链表的其它结点位置而头结点的删除和在其它结点删除是不一样的,头结点删除就让下一个结点当头结点就可以了;其它结点删除要找到前一个结点和后一个结点,然后把前结点和后结点链接起来就可以了。所以针对以上分析原创 2021-10-30 20:38:07 · 241 阅读 · 2 评论 -
【LeetCode之顺序表】:三道经典的顺序表OJ题(用C语言实现,附图详解)
文章目录1. 原地移除数组中所有的元素val2. 删除排序数组中的重复项3. 合并两个有序数组1. 原地移除数组中所有的元素valLeetCode链接:27. 移除元素2. 删除排序数组中的重复项3. 合并两个有序数组...原创 2021-10-29 22:54:05 · 434 阅读 · 12 评论 -
【数据结构初阶】:带头双向循环链表(用C语言实现,附图详解)
文章目录一、带头双向循环链表二、带头双向循环链表实现思路三、链表指针和结点内存布局图四、带头双向循环链表的初始化五、带头双向循环链表接口实现:1.尾部插入数据2.头部插入数据3.尾部删除数据4.头部删除数据5.显示数据6.查找数据7.在结点前面插入数据8.删除当前位置数据9.内存释放六、对头插 尾插 头删 尾删的改造七、总结(附源码)一、带头双向循环链表前面我们实现了无头单向非循环链表,特性为:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构原创 2021-10-27 23:49:20 · 1547 阅读 · 8 评论 -
【数据结构初阶】:无头单向不循环链表(用C语言实现,附图详解)
文章目录一、链表的概念二、链表的分类三、无头单向不循环链表的实现思路四、无头单向不循环链表内存布局图五、无头单向不循环链表接口实现:1.尾部插入数据2.头部插入数据3.尾部删除数据4.头部删除数据5.显示数据6.查找数据7.在结点前面插入数据8.在结点后面插入数据9.删除当前位置数据10.删除当前位置后一个数据11.内存释放六、内容总结(附源码)一、链表的概念链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点原创 2021-10-24 13:45:11 · 465 阅读 · 14 评论 -
【数据结构初阶】:动态顺序表的功能实现(用C语言实现,附图分析)
文章目录一、动态版本顺序表二、动态顺序表的实现思路三、动态顺序表内存布局图四、初始化顺序表和内存释放五、顺序表接口实现:1.尾部插入数据2.头部插入数据3.尾部删除数据4.头部删除数据5.显示数据6.查找数据7.在某个位置插入数据8.在某个位置删除数据六、对头插 尾插 头删 尾删 的改造七、总结一、动态版本顺序表在实现顺序表之前,我们要知道顺序表按照能不能扩容可以分为两种版本,静态版本和动态版本。静态版本就是把内容存到数组中,一旦数组在内存栈上开辟了,当数据存满的时候就不能再继续存储了。所以针对这个.原创 2021-10-16 16:08:21 · 1110 阅读 · 10 评论 -
谈谈算法中的时间复杂度和空间复杂度
文章目录算法的复杂度时间复杂度时间复杂度的概念大O的渐进表示法空间复杂度常见复杂度的计算例题常见函数1常见函数2常见用例3冒泡排序的复杂度算法的复杂度我们写代码要实现某种功能的时候,可以使用很多方法来解决,但是哪一种方法才是最好的呢?又怎么来衡量?所以就要引出算法复杂度的概念了。算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法原创 2021-10-13 16:19:05 · 583 阅读 · 8 评论