- 博客(56)
- 收藏
- 关注
原创 [数据结构]排序之 归并排序(有详细的递归图解)
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序核心步骤:归并:如果左区间和右区间都有序,那么一次比较,小的尾插到新空间,链表可以摘下来插入,数组不行,得借助新空间注:以下图片看不清楚可以点进去放大看。
2025-03-20 16:32:37
734
原创 [数据结构]排序之 快速排序详解(递归版&非递归版)
目录一、递归版本1. hoare版本(一)低配版(二)高配版①随机选key②三数取中法选key(在begin,end,mid三个数中选)2. 挖坑法3. 前后指针版本(推荐,细节容易把控)二、非递归版本结束后key左边的值都比key小,右边的都比key大代码如下:快速排序的特性总结:1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序2. 时间复杂度:O(N*logN)3. 空间复杂度:O(logN)4. 稳定性:不稳定影响快排性能的是key的位置,key的
2025-03-17 18:35:30
1320
原创 [数据结构]排序之 堆排序详解
所以如果用来排序的话,无论是向上调整还是向下调整建堆,总的时间复杂度都是O(N*logN)建堆和堆删除中都用到了向下调整,因此掌握了向下调整,就可以完成堆排序。注:向下建堆的效率O(N)比向上建堆的效率O(N*logN)高。向上调整建堆:模拟的是插入数据的过程。
2025-03-16 09:49:53
502
原创 [数据结构]排序之 直接选择排序
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的。O(N^2),之前的序列对排序没有影响,所以直接选择排序很烂,基本不会用。元素,则将它与这组元素中的最后一个(第一个)元素交换。位置的元素就是当前未排序部分的最大值时,在第一次交换。时,实际上交换的并不是最大值,从而导致排序结果出错。O(N^2) 最坏情况和最好情况都是。)集合中,重复上述步骤,直到集合剩余。指向的最大值元素已经被交换到了。若它不是这组元素中的最后一个。考虑这样一种情况:当。
2025-03-15 07:52:30
457
原创 [数据结构]排序之插入排序
当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与。array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移。注:基础不好的同学在写排序的时候建议先写单趟再写整体。元素集合越接近有序,直接插入排序算法的时间效率越高。单趟思想:将一个数字插入有序区间。O(N^2) 最坏情况。O(N^2) 最好情况。,它是一种稳定的排序算法。
2025-03-13 10:05:21
468
原创 [数据结构]排序之希尔排序( 缩小增量排序 )
时,数组已经接近有序的了,这样就会很快。在两层for循环里面还有一种写法:和上面的是一样的,上面的是一组排完再排第二组,这个是多组并排。的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定。红色的为一组,黄色的为一组,蓝色的为一组,紫色的为一组,黑色的为一组。简单来讲就是分组插排:间隔为gap的分为一组然后再进行插排。在第一趟排序中,将红色的进行排序,将黄色的进行排序……《数据结构-用面相对象方法与C++描述》--- 殷人昆。当gap=1就成了插入排序。
2025-03-12 08:29:14
620
原创 [数据结构]二叉树详解
对于任何一颗二叉树,如果度为0其叶节点个数为n0,度为2的分支结点个数为n2,则n0=n2+1(通俗来讲就是度为0的永远比度为2的多一个)。叉树比较难,为了降低学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,反过头再来研究二叉树真正的创建方式。不能把1的值带进队列,这样不好把1的左右孩子带进去,所以得存1的结构体,但是结构体比较大,所以存1的结构体的指针。:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。,则它就是满二叉树。
2025-03-04 15:47:33
1772
原创 [数据结构]队列详解
/ 链式结构:表示队列}QNode;// 队列的结构}Queue;front rear为什么不能放在struct QListNode里面?①冗余存储://每个 QListNode 节点都会包含 front 和tail 指针,这会导致大量的冗余存储。实际上,front 和 tail 只需要存储一次,而不是在每个节点中都存储。
2025-02-26 12:02:45
902
原创 Visual Studio 2022 调试指南:如何处理编译正确但运行结果错误的问题
在软件开发过程中,编译通过但运行结果错误是一个常见且令人困扰的问题。本文将详细介绍如何在 Visual Studio 2022 中有效地调试这类问题。我们将探讨如何利用断点、监视窗口、调用堆栈等调试工具,逐步排查代码中的逻辑错误。此外,文章还将介绍如何使用条件断点和异常处理来捕获难以发现的错误。通过本文的指导,您将能够更高效地定位和修复代码中的问题,确保程序不仅能够编译通过,还能正确运行。
2025-02-25 07:41:20
2461
原创 [C语言]动态内存分配详解
这些函数都是在堆区存放的,使用时需要stdlib.h这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。free函数用来释放动态开辟的内存。
2025-02-24 09:22:20
1658
原创 [数据结构]栈详解
在栈操作函数中,栈指针 ps 是操作栈的基础,如果 ps 为 NULL,那么后续对 ps 指向的栈结构的任何访问(如 ps->top)都会导致未定义行为,通常是程序崩溃。因此,在进行栈操作之前,需要先确保 ps 不是 NULL,assert(!实际上是在检查栈不为空的情况下才继续执行后续操作。,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。出栈:栈的删除操作叫做出栈。压栈:栈的插入操作叫做进栈。栈的实现一般可以使用。
2025-02-22 09:38:17
730
原创 [数据结构]单链表详解
/这里并不是结构体里面有个结构体,而是结构体里面有个指针,它的类型是结构体类型这里还不能这样写,这里涉及到编译器的查找规则:如果一个函数或者一个类型需要使用,那么编译器会向上查找而不会向下}SListNode;
2025-02-20 08:03:08
1401
原创 [数据结构]顺序表详解
线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
2025-02-19 11:27:15
954
原创 [C语言]分数求和 计算1/1 - 1/2 + 1/3 - 1/4 + 1/5 .......+1/99 - 1/100 的值,打印结果
【代码】用C语言分数求和 计算1/1 - 1/2 + 1/3 - 1/4 + 1/5 .......+1/99 - 1/100 的值,打印结果。
2025-02-14 11:24:40
213
原创 [C语言]指针进阶(超详细版)
数组指针是指针?还是数组?答案是:指针。我们已经熟悉:整形指针:存放整型地址的指针,同时 int * pint;能够指向整形数据的指针。浮点型指针:存放字符地址的指针,同时 float * pf;能够指向浮点型数据的指针。那数组指针应该是:存放数组地址的指针,能够指向数组的指针。下面代码哪个是数组指针?//p1, p2分别是什么?解释://解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。
2025-02-10 11:12:12
1662
原创 [C语言]指针初阶(超详细版)
1.指针是内存中一个最小单元的编号,也就是地址2.平时口语中说的指针,通常指的是指针变量,用来存放内存地址的变量&a----对a取地址,取出a的地址a是一个整型变量,整型变量占用四个字节,每个字节都用地址&a取出的是第一个字节的地址(较小的地址)int *pa=&a;pa被称为指针变量是专门用来存放地址的。
2025-02-09 08:33:37
999
原创 2015百度面试题:设计一个小程序来判断当前机器的字节序(大端&小端)
【代码】2015百度面试题:设计一个小程序来判断当前机器的字节序(大端&小端)
2025-02-08 08:12:37
437
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅