数据结构—C语言实现
文章平均质量分 82
本专栏数据结构与算法的代码实现均为C语言实现,包含基础的数据结构。
小白也有开发梦
种一棵树的最好时间是十年前,其次是现在。
展开
-
排序算法大全:冒泡排序【含优化】,选择排序【含优化】,直接插入排序,希尔排序,堆排序,快速排序【含3种实现版本及非递归实现】,归并排序【含非递归实现】。详细图解,文字解释,代码实现,性能分析。
七大排序详细图解,优化,代码实现。一、冒泡排序1、冒泡排序思想2、冒泡排序算法的性能分析二、选择排序1、选择排序思想2、选择排序算法的性能分析三、直接插入排序1、直接插入排序思想2、直接插入排序算法的性能分析四、希尔排序1、希尔排序思想2、希尔排序算法的性能分析五、堆排序六、快速排序1、hoare划分法2、挖坑法3、前后指针法快速排序优化快速排序的非递归实现七、归并排序1、归并排序递归实现2、归并排序非递归实现原创 2024-02-09 18:19:42 · 1078 阅读 · 1 评论 -
【数据结构】循环队列(数组实现)
将顺序存储队列的元素的一维数组首尾相接,形成一个环状,如下图所示,这种形式表示的队列称为循环队列。循环队列仍然是顺序队列结构,只是逻辑上和前面的顺序队列有所不同。#define MAXLEN 6 // 定义环形队列的最大长度为 6// 定义数据类型为整型typedef struct CircularQueue // 定义环形队列的结构体// 定义存储数据的数组// 定义队头和队尾指针int size;// 定义队列元素个数} CQueue;原创 2023-12-29 12:45:22 · 1668 阅读 · 0 评论 -
【数据结构】单链表的基本操作(C语言版)
单链表(Singly linked list)是一种常见的数据结构,它由一个结点(Node)的链表构成,每个结点包含两个域:数据域和指针域。数据域用于存储结点的数据,指针域用于存储下一个结点的地址。单链表中的第一个结点被称为头结点(Head),它用来存放链表的基地址。头结点中的指针域指向链表的第一个结点,最后一个结点的指针域指向空地址,表示链表结束。// 数据域,存储结点的数据// 指针域,指向下一个结点}ListNode;原创 2023-12-25 22:19:10 · 1265 阅读 · 0 评论 -
【数据结构】二叉树的创建和遍历:前序遍历,中序遍历,后序遍历,层次遍历
二叉树(Binary Tree)是有n(n≥0)个结点的有限集合:(1) 该集合或者为空(n=0);(2)或者由一个根结点及两个不相交的分别称为左子树和右子树组成的非空树;(3)左子树和右子树同样又都是二叉树。在一棵非空的二叉树中,每个结点至多只有两棵子树,分别称为左子树和右子树,且左右子树的次序不能任意交换。所以,二叉树是特殊的有序树。值得注意的是,由于二叉树上任结点的子树有左、右之分,因此即使一个结点只有一棵非空子树,仍须区别它是该结点的左子树还是右子树,这是与树不同的。原创 2024-01-03 15:21:41 · 1810 阅读 · 0 评论 -
【数据结构与算法】quicksort快速排序算法大全:快速排序hoare法,快速排序挖坑法,快速排序前后指针法,快速排序优化,快速排序的非递归实现
每次处理子数组时,选择一个枢轴元素进行划分,并将划分点的下标入栈。然后根据划分点将子数组分成两部分,分别将左侧和右侧的子数组边界入栈。这样可以确保先处理左侧子数组,再处理右侧子数组,达到快速排序的效果。挖坑法是一种简洁的快速排序实现方式,它通过交替移动两个指针,将元素一个个填入坑位的方式来进行划分。根据划分点的下标更新子数组边界,将左侧子数组的开始位置和结束位置入栈,再将右侧子数组的开始位置和结束位置入栈。快速排序的非递归实现使用了栈来模拟递归的过程,这样可以避免使用系统栈导致的递归调用过深的问题。原创 2024-01-19 14:59:01 · 536 阅读 · 0 评论 -
【数据结构与算法】排序算法:直接插入排序,希尔排序详解
当比较相等元素时,由于只有当前元素小于等于已排序部分的某个元素时才插入,因此相等元素的相对次序不会发生改变。直接插入排序是一种简单直观的排序算法,其思想是通过构建已排序部分和未排序部分,将待排序元素按照大小逐个插入到已排序部分的正确位置中,完成排序。需要注意的是,尽管直接插入排序在最坏情况下的时间复杂度较高,但对于小规模或基本有序的序列,直接插入排序的性能较为优秀。希尔排序的思想是利用了插入排序对基本有序的序列性能较好的特点,通过提前部分排序减少了逆序对的数量,从而提高了排序效率。原创 2024-01-19 14:59:37 · 377 阅读 · 0 评论 -
【数据结构】堆:堆的构建,堆的向上调整算法,堆的向下调整算法、堆排序
堆可以被看作是一棵完全二叉树的数组对象。即在存储结构上是数组,在逻辑结构上是一棵完全二叉树。在堆中,树的每个节点都满足堆属性,即父节点的值大于(或小于)其子节点的值。具体而言,对于最大堆,父节点的值大于等于其子节点的值;而对于最小堆,则是父节点的值小于等于其子节点的值。这使得堆的根节点(常常是数组的第一个元素)成为堆中最大(或最小)的元素。原创 2024-01-18 17:48:03 · 1589 阅读 · 0 评论 -
【数据结构】二叉树的基本操作大全,学会二叉树基本操作这一篇就够了:二叉树前序、中序、后序、层次遍历;求二叉树总结点个数,叶子结点个数,二叉树第k层的结点个数;求二叉树的高度;在二叉树中查找值为x的结点
【数据结构】二叉树的基本操作大全,学会二叉树基本操作这一篇就够了:二叉树前序、中序、后序、层次遍历;求二叉树总结点个数,叶子结点个数,二叉树第k层的结点个数;求二叉树的高度;在二叉树中查找值为x的结点原创 2024-01-03 03:09:29 · 2258 阅读 · 0 评论 -
【数据结构与算法】归并排序详解:归并排序算法,归并排序非递归实现
在合并的过程中,如果遇到两个相等的元素,我们会先将来自前一个子数组的元素放入辅助数组,这样可以确保相等元素的相对顺序不会改变。合并时,使用双指针i和j分别指向两个子数组的起始位置,比较两个子数组对应位置上的元素大小,较小的元素放入temp数组中,同时移动指针,直到一个子数组遍历完成。通过不断调整gap的大小,将待排序数组进行分组和合并操作,直到得到一个完全有序的数组。在每一轮合并中,将数组分为多个大小为gap的子数组,将相邻的两个子数组合并为一个有序子数组。更新gap的值为2倍,继续下一轮合并。原创 2024-01-21 15:55:34 · 780 阅读 · 0 评论 -
【数据结构】数组实现队列(详细版)
队列是一种基本的数据结构,它是一种先进先出(First In First Out,FIFO)的线性结构。队列只允许在表的一端进行插入,而在另一端进行删除操作。这就相当于把数据排成一排,先插入的排在前面,后插入的排在后面,之后进行删除操作时也只能从前面依次删除。这种数据结构一般用于需要按照先后顺序进行处理的问题,如模拟系统、计算机网络中的缓存、操作系统中的进程调度等。队列的基本操作包括入队(插入元素到队尾)和出队(从队头删除元素)原创 2023-12-28 18:29:16 · 2509 阅读 · 0 评论 -
【数据结构与算法】排序算法:冒泡排序,冒泡排序优化,选择排序、选择排序优化
冒泡排序的基本思想是通过相邻元素之间的比较和交换来逐步将最大(或最小)的元素移到右边(或左边)。思想:在优化版本的冒泡排序算法中,通过添加一个标记变量flag,可以在一轮排序过程中标记是否有进行过交换操作,通过这种方式,可以减少交换的次数,从而提高排序的效率。综上所述,选择排序的时间复杂度为O(n^2),空间复杂度为O(1),并且是一种不稳定的排序算法。通过每次从剩余未排序部分选择最小的元素,并将其放在已排序部分的末尾,逐步构建有序序列。优化版本的思想是在选择排序的基础上,原创 2024-01-18 18:28:46 · 620 阅读 · 0 评论 -
【数据结构】单链表实现队列
队列是一种常见的数据结构,它遵循先进先出(First-In-First-Out,FIFO)的原则。在队列中,新元素被添加到队尾,而只有队首的元素可以被移除。原创 2023-12-25 23:09:07 · 535 阅读 · 0 评论 -
【数据结构与算法】二叉树前序,中序,后序遍历非递归版。Leetcode接口
指针为空,则表示已经到达最左边的叶子节点,此时将栈顶节点出栈,将节点的值存入数组。指向该节点的右子树。原创 2024-02-01 21:50:32 · 597 阅读 · 0 评论