【数据结构】
文章平均质量分 59
必备武器
JoyCheung-
平心静噪
展开
-
【二叉树练习题】中缀表达式转换成后缀表达式
题解先使用中缀表达式构建二叉树中序遍历,运算符一定为父结点后续遍历的结果:abcd/+e*-原创 2022-02-04 13:13:07 · 287 阅读 · 0 评论 -
【数据结构】计数排序
计数排序前面专栏里讲的都是比较排序,计数排序是一种非比较排序。思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。对于 1000 、10001 、1002 类似的数据,从0开始会有大量的空间浪费,所以有优化的思路。遍历数组,找出最大和最小的值,这个值就是需要开辟的空间大小,然后将数映射到计数的数组中,取数的时候需要把数字加上最小值。C语言实现程序void CountSort(int* a, int n){ int max = a[0], min = a[0]; for (i原创 2021-12-05 13:06:53 · 1397 阅读 · 13 评论 -
【数据结构】归并排序_递归和非递归实现
常见的排序算法有以上八种,点击专栏就可以看其他排序算法,感兴趣的朋友们不妨点个收藏专栏。 ღ( ´・ᴗ・` )比心OJ链接归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并递归实现归并排序的空间复杂度是O(N),也就是要用一个临时数组存放排序后的数据。归并排.原创 2021-12-02 16:11:01 · 478 阅读 · 14 评论 -
【数据结构】快速排序非递归实现
常见的排序算法有以上八种,点击专栏就可以看其他排序算法,感兴趣的朋友们不妨点个收藏专栏。 ღ( ´・ᴗ・` )比心OJ链接快速排序的非递归实现可以使用 队列 和 栈进行。使用 队列 类似于 二叉树的层序遍历;使用 栈 类似于 二叉树的前序遍历。本文采用栈进行非递归实现。解题思想根据栈先入后出的特点,用栈实现快速排序非递归分为以下过程:右区间先入栈左区间入栈,再取出栈顶然后再右区间、左区间依次入栈,出左区间,直到栈为空。图解过程在一次单趟排序后,右区间、左区间依次入栈。栈中数.原创 2021-11-29 21:41:15 · 4408 阅读 · 23 评论 -
【数据结构】快速排序递归实现 _三种方法详解+优化
常见的排序算法有以上八种,所以预估会分成几期来讲,感兴趣的朋友们不妨点个收藏专栏。 ღ( ´・ᴗ・` )比心OJ链接快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。将区间按照基准值划分为左右两半部分的常见方式: Hoare法、挖坑法、前后指针法。快排又.原创 2021-11-28 09:06:49 · 3597 阅读 · 27 评论 -
【数据结构】选择排序
常见的排序算法有以上八种,所以预估会分成几期来讲,感兴趣的朋友们不妨点个收藏专栏。 ღ( ´・ᴗ・` )比心选择排序思想方法选择排序就是不断取出最大或者最小的数,关键点在于选数的方法上,这里基于选数进行第一次优化。每次选出最大和最小的数。其次,可以使用建堆的方式来选数,详细看这一篇 堆排序动图演示选择一个数:图解分析有这样一个数组,要求升序排列。每次找出最大值和最小值,分别和end数和begin数进行交换。注意点:此时maxi位于begin处,mini值和begin值交换的时候.原创 2021-11-20 16:34:30 · 938 阅读 · 13 评论 -
【数据结构】希尔排序
常见的排序算法有以上八种,所以预估会分成几期来讲,感兴趣的朋友们不妨点个收藏专栏。 ღ( ´・ᴗ・` )比心OJ链接希尔排序在 插入排序 已经提到当数组接近有序的时候,时间复杂度趋于O(N)。所以希尔排序是基于直接插入排序的优化,通过预排序使数组趋于有序,这种情况对逆序数组更加明显。希尔排序的分为预排序(gap > 1)和直接插入( gap == 1)排序两步骤。预排序,使数组接近有序按照gap分组,对每一组进行插入排序。假设 gap = 3对gap组预排序完毕对逆序数组.原创 2021-11-18 09:34:42 · 2062 阅读 · 10 评论 -
【数据结构】直接插入排序
常见的排序算法有以上八种,所以预估会分成几期来讲,感兴趣的朋友们不妨点个收藏专栏。 ღ( ´・ᴗ・` )比心插入排序基本思想直接插入排序是一种简单的插入排序方法,把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。可以类比我们玩扑克牌的时候。动图演示先来看个动图图解排序先看一趟排序,有这样一个数组此时end指向下标是0的位置,x是end后一个元素。排升序,a[end] > x, a[end+1] = a[.原创 2021-11-17 13:52:55 · 1306 阅读 · 15 评论 -
【数据结构】链式二叉树 - 前中后层序遍历+基本操作
二叉树 概念二叉树要么是空树,要么是非空树,即由根结点、根结点的左子树和根结点的右子树组成。可以看出二叉树是递归定义的,后序操作都是基于这个结论实现的。前序(先序)遍历按照 根结点-左子树-右子树 的顺序遍历树。void PreOrder(BTNode* root){ if (root == NULL) { printf("NULL "); return; } printf("%c ", root->data); PreOrder(root->left);原创 2021-11-15 22:26:30 · 1243 阅读 · 24 评论 -
【图解数据结构】堆排序
实现步骤把数组用堆的形式排列(小堆或者大堆)对堆进行排序Step1. 建堆方法一:把第一个数就看成是一个堆,之后的数据依次当作push数据,再向上调整堆到合适位置。如图,第一个数是70,已经是一个堆插入56,进行向上调整(此处认为建小堆)插入30,再次调整堆,依次类推…方法二:使用向下调整算法。向下调整算法的前提左右子树都是堆。Q: 这里有一个问题?该从哪里开始调整。因为叶子节点没有左右子树,叶子所在的子树不需要调整,所以要从倒数第一个非叶子节点的子树开始,即:最后一原创 2021-11-09 22:23:00 · 895 阅读 · 7 评论 -
【图解数据结构】堆 - 基本功能实现、向上调整、向下调整算法
前置知识堆本质上是一个完全二叉树,但存储结构是一个数组。这个是对堆进行代码编写的核心,要牢牢把握住!下文代码以大堆为例!堆结构定义堆的物理本质是一个数组,就可以像动态顺序表一样进行结构定义。typedef int HPDataType;typedef struct Heap{ HPDataType* a; int size; // 有效元素个数 int capacity; // 数组长度}HP;函数接口// 堆的初始化void HeapInit(HP* hp);// 堆的销原创 2021-11-07 14:20:28 · 1318 阅读 · 20 评论 -
【图解数据结构】二叉树的概念、性质、结构
堆的引出原创 2021-11-06 08:00:00 · 798 阅读 · 6 评论 -
【图解数据结构】树的概念及结构
树树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。就像这样根节点没有前驱结点除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继。树是递归定义的。==注意:==树形结构中,子树之间不能有交集,否则就不是树形结.原创 2021-11-05 21:46:26 · 1741 阅读 · 19 评论 -
【数据结构】队列
概念及结构队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。实现队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。所以下文采用 链表 结构。队列结点定义如下:typedef int QDataType;typedef struct QueueNode{原创 2021-11-02 22:46:14 · 131 阅读 · 10 评论 -
【数据结构初阶】栈
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。顺序存储还是链式存储?两种理论上都是可以的。数组栈链式栈数组栈结构体typedef int STDataType;typedef struct Stack{ STDataType* a; int top; int capacity;}ST;函数接口// 栈初始化 指针传递.原创 2021-10-30 17:58:49 · 391 阅读 · 19 评论 -
【数据结构初阶】图解链表(二)双向带头循环链表
单链表在之前的博客里已经详细讲解过了 (指路导航 无哨兵位单向非循环链表),接下来讲解的是 双向带头循环链表。源码地址链接一级指针还是二级指针?首先我们要确定的问题是带哨兵位的链表,需要传啥类型的实参?由图见,因为带哨兵位,不对phead进行修改,所以只需要传一级指针。结点结构体// 带头+双向+循环链表增删查改typedef int LTDataType;typedef struct ListNode { LTDataType data; struct ListNode* next原创 2021-10-30 16:42:07 · 697 阅读 · 16 评论 -
【数据结构初阶】链表详解(一)无哨兵位单向非循环链表
链表概念及结构概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。链式结构在逻辑上是连续的,但是在物理上不一定连续现实中的结点一般都是从堆上申请出来的从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续实际上链表的结构非常多样,组合起来有8种链表结构。1.单向或双向2.带头或者不带头3. 循环与非循环本文介绍的是 无头单向非循环链表。无头单向非循环链表:结构简单,一般不会单独用来存数据。实原创 2021-10-23 22:52:43 · 769 阅读 · 11 评论 -
【数据结构初阶】顺序表_增删查改、查询、打印、销毁 (附源码+realloc深解)
线性表线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。顺序表顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表一般可以分为:静态顺序表:使用定长数组存储元素# def原创 2021-10-15 13:46:25 · 719 阅读 · 21 评论 -
手撕九大排序算法
直接插入排序、希尔排序、选择排序 && 堆排序、冒泡排序 && 快速排序、归并排序、基数排序、计数排序 (非比较排序)原创 2021-08-20 18:07:28 · 3523 阅读 · 43 评论