![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构(C语言实现)
文章平均质量分 80
今天也要写bug、
编程三问:xx是什么?为什么要有xx?xx是怎么实现的?
展开
-
13迷宫问题(回溯思想)
迷宫问题是回溯思想的一种运用,一般可以用栈来实现文章目录迷宫问题求解题目分析代码实现迷宫最短路径求解题目分析代码实现迷宫问题求解原题链接迷宫问题.题目分析题目要求我们先输入两个数代表迷宫的行和列,然后再输入具体的数组内容。这里的起点是左上角,终点是右下角,注意这里有可能让我们输入多组迷宫,所以此时需要用while循环来实现多次输入。另外这个题目中,1代表墙,不能走,0代表路,可以走。从起点开始走迷宫,我们得先告诉程序向哪走,这里按上下左右的顺序依次走,如果走不通就向另一个方向走,要实现这原创 2021-08-12 14:03:35 · 1539 阅读 · 6 评论 -
12八大排序算法的稳定性以及时间空间复杂度总结
文章目录一、排序的稳定性二、八种排序方式的复杂度和稳定性一、排序的稳定性假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。至于为什么有的排序不稳定,这和排序本身的实现算法逻辑有关,以快排的挖坑法为例:如果begin[i]和key相等,begin会跳过这个数,最终交换以后key会到这个数的右边,顺序就原创 2021-08-09 21:36:43 · 1945 阅读 · 1 评论 -
11非比较排序算法---计数排序
基数排序、计数排序都属于非比较排序。文章目录一、计数排序1.1.时间空间复杂度分析一、计数排序这种排序方法并不需要比较数组中的元素大小来排顺序,而是用一个数组直接统计每个数出现的次数,然后从小到大遍历这个数组就可以了。不过这样有很大的浪费,数组中最大的元素是max,count数组的元素个数就得是max+1,比如一个数组[200,199,201],count数组的元素个数就是202,但是199前面的空间都没有用。这个时候如果让数组中最小值充当count数组中的0下标,数组中的最大值就相对于coun原创 2021-08-09 21:35:02 · 366 阅读 · 0 评论 -
10归并排序算法
文章目录一、归并排序1.1.归并排序的递归实现1.2.归并排序的非递归实现1.3.时间空间复杂度分析一、归并排序归并的的思路是:将数组拆分成若干个有序的子序列(一般是只有一个数的子序列),然后将已有序的子序列合并,得到完全有序的序列。1.1.归并排序的递归实现//归并排序的子函数//这个函数将左右区间进行归并void _MergeSort(int* a, int left, int right,int*tmp){ if (left >= right) { return;原创 2021-08-09 21:32:00 · 1549 阅读 · 1 评论 -
09交换排序算法---冒泡排序和快速排序
文章目录一、冒泡排序1.1.时间空间复杂度分析二、快速排序2.1.快排的递归实现2.1.1.挖坑法2.1.2.左右指针法2.1.3.前后指针法2.2.快排的非递归实现2.2.1.挖坑法2.2.2.左右指针法2.2.3.前后指针法2.2.4.用栈实现非递归2.3.快排的优化2.3.1三数取中2.3.2.小区间优化2.4.时间空间复杂度分析一、冒泡排序冒泡排序应该是最简单也是最容易理解的一种排序算法,它的逻辑是每趟将最大的数移到数组的最右边:我之前写过冒泡排序的详细说明,链接如下:冒泡排序代码实现:原创 2021-08-09 21:30:15 · 3688 阅读 · 17 评论 -
08选择排序算法---直接选择排序和堆排序
文章目录一、直接选择排序1.2.时间和空间复杂度分析二、堆排序2.1.堆和向下调整算法2.2.使用向下调整算法建堆2.3.堆排序2.4.时间空间复杂度分析一、直接选择排序它的实现方式是遍历整个数组然后找到最小和最大的数将它们放到数组的开头和结尾,然后缩小范围重复这个过程。这个动图是只找最小的数:代码实现:void SelectSort(int* a, int n){ int begin = 0, end = n - 1;//起始位置下标,最后一个元素下标 while (begin &l.原创 2021-08-09 21:27:20 · 440 阅读 · 0 评论 -
07插入排序算法---直接插入排序和希尔排序
文章目录一、直接插入排序1.1.时间空间复杂度分析二、希尔排序2.1.时间和空间复杂度分析一、直接插入排序直接插入排序的思路是:假设前n-1个元素已有序,则将第n个元素插入到n-1个有序元素中,这样前n个元素都已经有序,再用这样的方法插入第n+1个元素、第n+2个元素,一直到最后一个元素,这样整个数组就都有序了。但是一开始并不能确定究竟前几个元素是有序的,所以我们只能默认第1个元素是有序的,然后依次将其后面的元素依次插入。直到最后一个元素也插入,数组有序。代码实现:void Insert.原创 2021-08-09 21:24:31 · 316 阅读 · 1 评论 -
06树和二叉树
之前的顺序表和链表都是一种线性的结构,树是非线性的结构。文章目录一、树的概念1.1.树用代码表示二、二叉树2.1特殊的二叉树2.2.二叉树的性质2.3.二叉树的存储形式2.3.1.顺序存储2.3.2.链式存储2.4.二叉树的遍历2.4.1.前序遍历2.4.2.中序遍历2.4.3.后序遍历2.5.二叉树的一些题目三、二叉树的代码实现3.1.测试代码一、树的概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成,当 n=0 时,称为空树。树的起始节点是一个特殊的结点,称为根结点,原创 2021-08-05 22:32:36 · 1246 阅读 · 13 评论 -
05线性表之栈和队列
栈和队列也是线性表的两种不同的形式,它们的实现方式和顺序表与链表类似,但是在逻辑结构上有一些差别。文章目录栈栈的顺序表形式实现栈的测试代码队列队列的单链表实现队列测试代码栈栈是一种特殊的线性表。栈的形式类似于弹夹,其只允许在固定的一端进行插入和删除元素操作。也就是说只允许在出口(弹夹顶部)插入元素(放入子弹)和删除元素(发射子弹)。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。压栈:栈的插入操作叫做进栈/压栈/入栈,存入的数据在栈顶。出栈:栈的删除操作叫做出栈。输出数据也在栈顶。由原创 2021-08-03 01:48:02 · 387 阅读 · 2 评论 -
04线性表之带哨兵位头结点的双向循环链表
单向链表存在一些缺陷:1.无法从后往前遍历。2.无法找到节点的前一个节点。3.插入和删除数据的时间复杂度为O(N)。这对这些缺陷,双向循环链表提供了很好的解决办法,双向循环链表的插入和删除时间复杂度为O(1)。文章目录带头双向循环链表带头双向循环链表代码实现带头双向循环链表带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了。这个链表的结构如下:箭头的指向就代原创 2021-08-01 21:58:03 · 630 阅读 · 1 评论 -
03线性表之单向链表
顺序表存在一些问题没法解决:空间不够增容以后会有一定的性能消耗,可能存在空间浪费;头部或者中部左右的插入删除效率低,时间复杂度为O(N)。因此链表就很好的解决了这些问题。文章目录链表的定义单向链表的代码实现链表的定义链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。链表并不需要像线性表一样动态开辟连续的空间,链表每个节点的空间不一定连续,它们之间通过结构体指针相互访问。单向链表的代码实现单向链表的结构如下:定义链表type原创 2021-08-01 00:14:33 · 205 阅读 · 0 评论 -
02线性表之顺序表
在之前我们学的变量数据中,各个数据之间相互独立的,通过一个变量是无法访问另一个变量的。但是线性表和它们不同,线性表中的数据在逻辑结构上相互挨着,因此一个数据和它相邻的数据之间是有联系的,比如数组。在顺序表中我们用到了C语言中结构体和动态开辟内存的知识。文章目录线性表的概念顺序表顺序表的代码实现顺序表菜单实现线性表的概念线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”。线性表是n个具有相同特性的数据元素的有限序列。 线性表是一原创 2021-07-30 21:59:52 · 191 阅读 · 2 评论 -
01数据结构中的时间复杂度和空间复杂度
我们之前学的冒泡排序、二分查找等操作,实际上都是一种算法,而衡量算法好坏的标准则是数据结构中的时间复杂度和空间复杂度。本章将带大家了解C语言数据结构中算法的时间复杂度和空间复杂度的概念,以及它们是如何计算的。文章目录时间复杂度常见的时间复杂度计算空间复杂度常见的空间复杂度计算时间复杂度一个算法的运行是需要时间的,而这个运行时间在不同的计算机上是不同的,因此我们无法定量去衡量这个算法的运行时间,但是可以用该算法的执行次数来判断它运行所需的时间,执行次数越多,所需的时间就越长,因此它的时间复杂度就越原创 2021-07-27 23:12:20 · 254 阅读 · 1 评论