![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 55
晴晴学语言
这个作者很懒,什么都没留下…
展开
-
数据结构--排序算法复杂度及稳定性分析
1 验证各种排序算法的时间数量级void testOP() { srand(time(0)); const int N = 100000; int* a1 = (int*)malloc(sizeof(int) * N); int* a2 = (int*)malloc(sizeof(int) * N); int* a3 = (int*)malloc(sizeof(int) * N); int* a4 = (int*)malloc(sizeof(int) * N); int* a5 = (int原创 2021-02-26 00:25:01 · 199 阅读 · 0 评论 -
数据结构--计数排序(鸽巢原理)
1 基本思想计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。操作步骤:统计相同元素出现次数根据统计的结果将序列回收到原来的序列中2 算法示意图3 程序代码#include<stdio.h>#include<stdlib.h>#include<string.h>void countSort(int* arr, int n) { int max , min; max = min = arr[0]; //找到最大值和最小值 for (in原创 2021-02-25 22:47:38 · 285 阅读 · 0 评论 -
数据结构--归并排序
1 基本思想归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,在使子序列段间有序。若将两个有序表合并称一个有序表,称为二路归并。2 算法示意图3 递归实现归并排序#include<stdio.h>#include<stdlib.h>#include<string.h>//tmp辅助空间 arr待排序数组void merge(int* arr, int原创 2021-02-25 22:16:08 · 161 阅读 · 0 评论 -
数据结构--冒泡排序和快速排序
1 交换排序根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。2 冒泡排序2.1 基本思想在区间[0,n-1]中,相邻元素进行比较,大的元素向后移动,并减小区间,在[0,n-2]中重复上述操作,直至不再有元素的移动或者区间大小为1时排序完成。2.2 算法示意图2.3 程序代码#include<stdio.h>#include<stdlib.h>void swap(i原创 2021-02-25 18:41:30 · 404 阅读 · 0 评论 -
数据结构--直接选择排序和堆排序
1 选择排序2 直接选择排序2.1 基本思想2.2 算法示意图2.3 程序代码2.4 验证代码2.5 直接选择排序特性3 堆排序2.1 基本思想2.2 算法示意图2.3 程序代码2.4 验证代码2.5 堆排序特性原创 2021-02-21 23:19:06 · 192 阅读 · 0 评论 -
数据结构--直接插入排序与希尔排序
1 插入排序直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键字码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。2 直接插入排序2.1 基本思想当插入第i(i>=1)i(i>=1)i(i>=1)个元素时,前面的array[0]、array[1]、…、array[i-1]已经排好序,此时用array[i]的排序码与array[i-1]、array[i-2]、…的排序码顺序进行比较,找到插入位置即将array[i]插原创 2021-02-21 18:55:05 · 236 阅读 · 3 评论 -
数据结构--排序简介
1 排序的概念排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或者递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j]r[i] = r[j]r[i]=r[j],且r[i]r[i]r[i]在r[j]r[j]r[j]之前,而在排序后的序列中,r[i]r[i]r[i]仍在r[j]r[j]r[j]之前,则称这些排序算法是稳定的,否则称为不稳定的。内部排序:数据元素全部放在内存中的原创 2021-02-21 15:03:10 · 133 阅读 · 0 评论 -
数据结构--递归、非递归实现二叉树的后序遍历
1 后序遍历完成int* preorderTraversal(struct TreeNode* root, int* returnSize)函数,使其可以实现前序遍历的功能题目链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/1.1 递归实现 int getSize(struct TreeNode* root){ if(root == NULL) return 0 ; return原创 2021-02-21 00:21:23 · 98 阅读 · 0 评论 -
数据结构--递归、非递归实现二叉树的中序遍历
1 中序遍历完成int* preorderTraversal(struct TreeNode* root, int* returnSize)函数,使其可以实现前序遍历的功能题目链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/1.1 递归实现 int getSize(struct TreeNode* root){ if(root == NULL) return 0 ; return ge原创 2021-02-20 19:01:26 · 123 阅读 · 0 评论 -
数据结构--递归、非递归实现二叉树的前序遍历
1 前序遍历完成int* preorderTraversal(struct TreeNode* root, int* returnSize)函数,使其可以实现前序遍历的功能1.1 递归实现struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right;};int getSize(struct TreeNode* root){ if(root == NULL) return 0 ;原创 2021-02-20 18:46:58 · 183 阅读 · 0 评论 -
数据结构--二叉树的二叉链表实现
1 二叉树的二叉链表示意图 二叉链表的每个结点由三个域组成:数据域,左指针域和右指针域。左右指针分别用来保存左右孩子结点的存储地址。2 二叉链表实现二叉树2.1 头文件及其定义原创 2021-02-19 16:36:21 · 6310 阅读 · 0 评论 -
数据结构--二叉树链式结构的遍历
1 二叉树的链式结构 二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链表来指示元素的逻辑关系。 链式结构可以分为二叉链表和三叉链表,我们使用最多的是二叉链表。 二叉链表的每个结点由三个域组成:数据域,左指针域和右指针域。左右指针分别用来保存左右孩子结点的存储地址。2 二叉树链式结构的遍历 所谓遍历是指沿着某条搜索路线,依次对树中每个结点均做一次且仅作一次访问。访问结点所做的操作依赖于具体的应用问题。遍历是二叉树上最重要的运算之一,是二叉树上进行其他运算之基础。2.1 前序遍历:原创 2021-01-24 22:41:35 · 620 阅读 · 0 评论 -
数据结构--堆排序
1 堆排序的概述利用堆的性质,我们可以实现对数组的排序。大小为n的数组看作一棵完全二叉树,将其创建成大根堆,交换堆顶与堆的最后一个元素,之后将前n-1个数据看作一棵完全二叉树,再次调整成堆,以此类推,直至只剩一个元素,这时已将数组排序完成。示意图如下:2 堆排序的算法#include<stdio.h>#include<stdlib.h>typedef int HPDataType;/*实现数组中两个位置值的交换*/void Swap(HPDataType* ar原创 2021-01-24 17:26:00 · 155 阅读 · 0 评论 -
数据结构--堆的概念及实现
1 堆的概念及结构如果有一个关键码的集合K={k0,k1,k2,...,kn−1}K = \{ k_0 , k_1 , k_2,...,k_{n-1} \}K={k0,k1,k2,...,kn−1},把它的所有元素按照完全二叉树的顺序存储方式存储在一个一维数组中,并满足Ki<=K2i+1且Ki<=K2i+2,i=0,1,2......K_i <= K_{2i+1}且K_i <= K_{2i+2},i=0,1,2......Ki<=K2i+1且Ki<=K2原创 2021-01-24 16:48:37 · 283 阅读 · 0 评论 -
数据结构--二叉树的数组实现
对于一棵二叉树,可以将结点从上至下从左至右的顺序依次存入数组中,如下图:但是,一般使用数组只适合表示完全二叉树,而不适合用来存储非完全二叉树,因为可能存在大量的空间浪费,如下图所示:堆是一种特殊的完全二叉树,故我们一般使用数组来存储堆。需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。下一篇我们将详细的介绍堆的概念及其实现。...原创 2021-01-22 23:33:24 · 673 阅读 · 0 评论 -
数据结构--二叉树的概念和结构
1 二叉树的概念一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。二叉树的特点:1.每个结点最多有两棵子树,即二叉树不存在度大于2的结点。2.二叉树的子树有左右之分,即子树的次序不能颠倒。2 数据结构中的二叉树3 特殊的二叉树3.1 满二叉树一个二叉树,如果每一层的结点都达到最大值,则这个二叉树就是满二叉树。即,如果一个二叉树的层数为k,且结点数为2k−12^k-12k−1,则它就是满二叉树。3.2 完全二叉树对一个满二叉树原创 2021-01-22 22:25:47 · 936 阅读 · 0 评论 -
数据结构--树的概念及结构
1 树的概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像是一颗倒挂的树。树的定义:有一个特殊的结点,称为根节点,根节点没有前驱结点。除根节点外,其余节点被分成M(M>0)个互不相交的集合T1、T2、…Tm,其中每一个集合Ti(1<=i<=m)又是一颗结构与树类似的子树。每个子树的根节点有且只有一个前驱,可以有0个或多个后继。因此,树是递归定义的。2 树的性质子树互不相交;除了根节点外,每个原创 2021-01-21 23:24:47 · 1200 阅读 · 0 评论 -
数据结构--循环队列的数组实现
1 循环队列的概念原创 2021-01-19 17:50:31 · 493 阅读 · 0 评论 -
数据结构--队列的数组实现
1 数组实现队列的示意图队列的表示如下:进行入队操作(尾插):进行出队操作(头删):2 数组实现队列2.1 头文件及其定义#include<stdio.h>#include<stdlib.h>typedef int QDataType;typedef struct Queue { QDataType* data;//存储队列的数据 int rear; //表示队尾,指向队列最后一个元素的下一个位置 int capacity;//表示数组的大小}Q原创 2021-01-18 21:55:23 · 100 阅读 · 0 评论 -
数据结构--队列的链表实现
1 链表实现队列的示意图使用单向无头非循环链表来表示队列,这里对链表进行优化,添加一个尾指针,指向队列的队尾,链表表头则指向队列的队头。进行入队操作(尾插):进行出队操作(头删):2 链表实现队列2.1 头文件及其定义#include<stdio.h>#include<stdlib.h>typedef int QDataType;typedef struct QNode { QDataType data; struct QNode* next;} Q原创 2021-01-18 21:07:49 · 394 阅读 · 0 评论 -
数据结构--队列的概念及结构
1 队列的概念队列是一种特殊的线性表,它只允许在一端进行插入数据操作,在另一端进行删除数据的操作。进行插入操作的一端称为队尾,进行删除操作的一端称为队头。2 入队和出队入队:队列的插入操作称为入队。出队:队列的删除操作称为出队。3 队列的实现队列可以使用数组和链表进行实现,但是由于数组在出数据的时候效率较低,这里选择使用链表来实现队列。...原创 2021-01-18 19:34:12 · 708 阅读 · 0 评论 -
数据结构--栈的双向带头循环链表实现
1 链表实现栈的示意图使用双向带头循环链表来表示栈,表头和表尾均可表示为栈顶,这里以表头为栈顶为例。进行入栈操作(头插):进行出栈操作(头删):2 链表实现栈2.1 头文件及其定义#include<stdio.h>#include<stdlib.h>typedef int STDataType;typedef struct LstkNode { STDataType data; struct ListNode* prev; struct ListNod原创 2021-01-10 20:59:51 · 719 阅读 · 0 评论 -
数据结构--栈的数组实现
1 数组实现栈的示意图栈stack的表示如下:进行入栈操作(尾插):进行出栈操作(尾删):2 数组实现栈2.1 头文件及定义定长的静态栈的结构#include<stdio.h>#include<stdlib.h>typedef int STDataType;//数组为静态数组,无法进行扩容#define N 10typedef struct Stack{ STDataType a[N]; int top; // 栈顶}Stack;支持动态原创 2021-01-10 19:45:23 · 225 阅读 · 0 评论 -
数据结构--栈的基本概念
1 栈的概念及结构1.1 栈的概念栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。实际中的案例:一群人乘坐电梯,先进电梯的人最后出电梯,最后进电梯的人最先出电梯。1.2压栈与出栈压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈,出数据在站栈顶。2 栈的实现栈的实现一般可以使用数组或者链表实现,相对而言原创 2021-01-10 19:42:25 · 729 阅读 · 0 评论 -
数据结构--顺序表与链表的区别
1 顺序表顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。 优点:(1)存储空间连续;(2)支持随机访问;(3)空间利用率高,不容易造成内存碎片;(4)尾插尾删操作效率高。 缺点:(1)在中间或者前面插入数据时的时间复杂度为O(n);(2)存储空间的容量可能不够用,可能存在增容的问题,而增容的代价很高。2 链表链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。原创 2021-01-10 15:23:35 · 1229 阅读 · 0 评论 -
数据结构--双向带头循环链表接口的实现
1 双向带头循环链表结构双向带头循环链表的示意图如下:它的定义如下://无头单向非循环链表的定义typedef int LDataType ;typedef struct ListNode {LDataType data ;struct ListNode* next ;struct ListNode* prev ;}ListNode;typedef struct List {struct ListNode* head;}List;2 无头单向非循环链表接口的实现2.1 头原创 2021-01-08 19:00:36 · 126 阅读 · 0 评论 -
数据结构--无头单向非循环链表接口的实现
1 无头单向非循环链表结构无头单向非循环链表的示意图如下:它的定义如下://无头单向非循环链表的定义typedef int LDataType;typedef struct ListNode {LDataType data;struct ListNode* next;}ListNode;typedef struct List {ListNode* head;}List;2 无头单向非循环链表接口的实现2.1 头文件及链表的定义#include<stdio.h>原创 2020-12-17 11:48:48 · 137 阅读 · 0 评论 -
数据结构--链表概念及常见链表结构
1 链表的概念链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表的结构由以下8种:1、不带头单向循环结构2、不带头单向非循环结构3、不带头双向循环结构4、不带头双向非循环结构5、带头单向循环结构6、带头单向非循环结构7、带头双向循环结构8、带头双向非循环结构存储结构如下:不带头单向循环结构不带头单向非循环结构不带头双向循环结构不带头双向非循环结构带头单向循环结构带头单向非循环结构原创 2020-12-17 00:09:25 · 10540 阅读 · 0 评论 -
数据结构--线性表与顺序表
1 线性表线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表指的是在逻辑上是线性结构,也就是指连续的一条直线。但在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。数组的存储结构:链表的存储结构:2 顺序表2.1 顺序表的概念与结构顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。原创 2020-12-08 11:24:31 · 7599 阅读 · 1 评论 -
数据结构--时间复杂度和空间复杂度概念及实例
1数据结构1.1 什么是数据结构?数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。1.2 什么是算法?算法(Algorithm):就是定义良好的计算过程,取一个或一组的值作为输入,并产生一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。2时间复杂度与空间复杂度2.1 算法效率算法效率分为两种:一种是时间效率,一种是空间效率。时间效率被称为时间复杂度,空间效率被称为空间复杂度。时间复杂度主原创 2020-12-05 16:51:20 · 474 阅读 · 0 评论