- 博客(67)
- 收藏
- 关注
原创 快速排序的深入优化探讨
决定快排性能的关键点是每次单趟排序后,key对数组的分割,如果每次选key基本⼆分居中,那么快排的递归树就是颗均匀的满⼆叉树,性能最佳。但是实践中虽然不可能每次都是⼆分居中,但是性能也还是可控的。但是如果出现每次选到最小值/最大值,划分为0个和N-1的子问题时,时间复杂度为O(N^2),数组序列有序时就会出现这样的问题,但是当数组中有大量重复数据时,之前的快速排序方法就会比较慢,因此我们需要更进算法。
2024-08-20 16:25:17
176
9
原创 贪吃蛇游戏
Windows这个多作业系统除了协调应⽤程序的执行、分配内存、管理资源之外,它同时也是⼀个很大的服务中心,调用这个服务中心的各种服务(每⼀种服务就是⼀个函数),可以帮应用程式达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序,所以便称之为,简称API函数。WIN32API也就位平台的应用程序编程接口。245OK , //正常运行 KILL_BY_WALL , //撞墙 KILL_BY_SELF , //咬到自己 END_NOMAL //正常结束 };
2024-08-20 10:46:54
541
13
原创 类和对象(3)
C++C++operatorthisoperator@Dateoperator-operator+++前置++后置++operator++C++后置++int前置++<<>>this<<cout。
2024-08-14 19:56:32
888
3
原创 计数排序以及排序总结
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。排序方式平均情况最好情况最坏情况辅助空间稳定性冒泡排序O(n^2)O(n)O(n^2)O(1)稳定直接选择排序O(n^2)O(n^2)O(n^2)O(1)不稳定直接插入排序O(n^2)O(n)O(n^2)
2024-08-14 09:58:46
443
15
原创 类和对象(2)
⼀个类,我们不写的情况下编译器会默认生成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个。其次就是C++11以后还会增加两个默认成员函数,和。
2024-08-11 18:05:39
1037
3
原创 类和对象(1)
为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前面或者后面加或者开头,注意中这个并不是强制的,只是⼀些惯例,具体看公司的要求。中也可以定义类,兼容C中的用法,同时升级成了类,明显的变化是中可以定义函数,⼀般情况下我们还是推荐用定义类。定义在类⾯的成员函数默认为。访问限定符⼀种实现封装的方式,用类将对象的属性与方法结合在⼀块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。修饰的成员在类外可以直接被访问;和修饰的成员在类外不能直接被访问,和是⼀样的
2024-08-07 20:19:24
925
12
原创 直接插入排序和希尔排序
希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定⼀个整数(通常是gap=n/3+1),把待排序文件所有记录分成各组,所有的距离相等的记录分在同一组内,并对每一组内的记录进行排序,然后。所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。得到下⼀个整数,再将数组分成各组,进行插入排序,当。的排序码顺序进行比较,找到插入位置。插⼊,原来位置上的元素顺序后移。时,就相当于直接插入排序。
2024-08-05 11:25:26
309
4
原创 二叉树的选择题
某⼆叉树的后序遍历序列与中序遍历序列相同,均为ABCDEF ,则按层次输出(同⼀层从左到右)的序列为:()设⼀课⼆叉树的中序遍历序列:badce,后序遍历序列:bdeca,则⼆叉树前序遍历序列为____。某⼆叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该⼆叉树中的叶结点数为( )⼀棵完全⼆叉树的结点数位为531个,那么这棵树的高度为( )⼀个具有767个结点的完全⼆叉树,其叶子结点个数为()二叉树的先序遍历的第一个结点为根结点,所以选A。对任何一棵二叉树,如果度为。
2024-08-05 08:59:37
818
原创 C++入门基础
定义命名空间,需要使用到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出⼀个域这个域跟全局域各自独立,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。C++中域有函数局部域全局域命名空间域类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。
2024-08-02 19:09:50
1145
7
原创 二叉树——链式结构的实现
用链表来表示⼀棵⼆叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址。首先是分为三个文件进行实现:tree.h、tree.c、test.c。访问顺序为:根结点、左子树、右子树。访问顺序为:左子树、根结点、右子树。访问顺序为:左子树、右子树、根结点。判断二叉树是否为完全二叉树。⼆叉树查找值为x的结点。⼆叉树第k层结点个数。
2024-07-31 09:27:14
431
6
原创 二叉树(2)
第h层, 2^(h-1)个结点,交换到根结点后,需要向下移动h-1层。第3层, 2^2个结点,交换到根结点后,需要向下移动2层。第4层, 2^3个结点,交换到根结点后,需要向下移动3层。第1层,2^0个结点,交换到根结点后,需要向下移动0层。第2层,2^1个结点,交换到根结点后,需要向下移动1层。第h层,2^(h-1)个结点,需要向上移动h-1层。第h-1层,2^(h-2)个结点,需要向下移动1层。第1层,2^0个结点,需要向下移动h-1层。第2层,2^1个结点,需要向下移动h-2层。
2024-07-29 12:37:24
411
2
原创 二叉树以及堆的实现
树是⼀种非线性的数据结构,它是由n(n>=0)个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,而叶朝下的。有⼀个特殊的结点,称为根结点,根结点没有前驱结点。除根结点外,其余结点被分成M(M>0)个互不相交的集合,其中每⼀个集合又是⼀棵结构与树类似的⼦树。每棵子树的根结有且只有⼀个前驱,可以有0个或多个后继。因此,树是递归定义的。子树不相交除了根结点外,每个结点有且仅有一个父结点一棵N个结点的树有N-1条边。
2024-07-27 14:54:46
964
9
原创 栈和队列的相关练习
本题可以借助数组作为底层的结构,因此在初始化时,动态开辟一个数组,并将数组的头尾和数组大小进行记录。思路同出队方法,只是不需要进行出栈的操作,直接返回栈顶元素的值。寻找不为空的队列,将该队列的队尾元素进行返回。首先引用上一篇博客中的队列的相关操作。首先引用上上篇博客中栈的相关操作。将两个队列分别进行销毁,并将。往不为空的队列中入队。直接进行入栈操作即可。
2024-07-27 08:57:07
425
7
原创 单链表的应用(4)
思路:让⼀个指针从链表起始位置开始遍历链表,同时让⼀个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均⾛⼀步,最终肯定会在入口点的位置相遇。即:⼀个指针从链表起始位置运行,⼀个指针从相遇点位置绕环,每次都走⼀步,两个指针最终会在入口点的位置相遇。由step1中得出的结论,如果N是偶数,则第⼀圈快慢指针就相遇了。的情况不成立 ,既然不存在该情况,则快指针⼀次⾛3步最终⼀定也可以相遇。2.慢指针进环之后,快指针肯定会在慢指针走⼀圈之内追上慢指针。所以当快指针走两步,慢指针走一步时,它们肯定会相遇。
2024-07-21 15:35:11
883
11
原创 单链表的应用(3)
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回。实现一种算法,找出单向链表中倒数第 k 个节点。给你两个单链表的头节点。
2024-07-21 09:32:15
301
1
原创 顺序表的应用——通讯录
通讯录增加联系人的操作需要提前将联系人的信息存储到一个新建的结构体中,再将结构体尾插入通讯录中。查找联系人是否存在的操作(以姓名为例)只需将联系人的姓名与待查找人的姓名进行对比即可。打印目录,让使用通讯录的人通过输入的数字来实现相对应的操作。通讯录的初始化操作同顺序表的初始化操作。通讯录的销毁操作同顺序表的销毁操作。从头遍历顺序表,并对数据进行打印。
2024-07-17 16:22:18
320
原创 数据结构和顺序表
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列。其中唯一的第一个数据元素称为表头元素唯一的最后一个元素称为表尾元素,除第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外,每个元素有且仅有一个直接后继。
2024-07-01 17:36:53
292
2
原创 错题集(c语言)
思路:第一次循环开始前:x=30,y=0,结束:x=15,y=2第二次循环开始前:x=14,y=3,结束:x=7,y=5第三次循环开始前:x=6,y=6,(由于判断语句中的符号为“,”因此还会进入循环),结束:x=3,y=8第四次循环开始前:x=2,y=9,结束:x=1,y=11第五次循环开始前:x=0,y=12,不满足判断语句,退出循环。x=0,y=12注意“=”最后执行,因此答案为:
2023-11-18 19:28:15
184
原创 单链表的应用(2)
轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?你不需要保留每个分区中各节点的初始相对位置。的人开始报数,报到 m 的人离开。,请你对链表进行分隔,使得所有。的值的结点,一个存放大于等于。分别为两个链表的头结点,分别为两个链表的尾结点。给你一个链表的头节点。是否为空,空则直接返回。,将大小链表连接在一起。是否为空,不为空则将。
2023-11-05 20:00:16
169
原创 单链表的应用(1)
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。的值不会是空,而是旧链表最后一个结点的值,因此我们需要进行判断,当。(4)当运行结束时,代表旧链表运行完毕,当最后一个结点等于。思路:(1)创建三个结构体指针,分别代表一条新链表的头。思路:(1)运用快慢指针,创建两个结构体指针,分别为。,请你反转链表,并返回反转后的链表。思路:(1)若链表为空,则直接返回空。,不为空则进行新链表结点的插入,即将。时:1.当新链表为空时,将新链表的。,请你找出并返回链表的中间结点。
2023-11-04 23:16:35
166
原创 单链表专题
链表是⼀种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表。test.h(包括所有程序的头文件和函数的声明)test.c(代码运行测试)中的指针链接次序实现的。
2023-11-03 18:50:48
77
1
原创 c语言知识的补充
表达式的值与某个常量表达式的值相等,则执行该常量表达式后的所有语句段(包括default中的语句段)。不返回结果的函数定义中,void不能省略,否则,函数类型就会变成int。(本博客的知识点会比较分散,并会不断的持续更新)头文件:#include
2023-10-14 20:27:02
46
原创 编程100题(7)
给你⼀个字符串 s 和⼀个字符 letter ,返回在 s 中等于 letter 字符所占的 百分⽐ ,向下 取整到最接近的百分⽐。解释: 对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。解释: nums 的元素和是 1 + 15 + 6+ 3 = 25。nums 的数字和是 1 + 1 + 5 + 6 + 3 = 16。解释: nums 的元素和是 1 + 2 + 3 + 4 = 10。对于 nums[4]=3存在三个比它小的数字:(1,2 和 2)。
2023-10-07 23:18:56
55
原创 预处理详解
C语⾔设置了⼀些预定义符号,可以直接使⽤,预定义符号也是在预处理期间处理的。__FILE__ //进⾏编译的源⽂件(文件名)__LINE__ //⽂件当前的⾏号__DATE__ //⽂件被编译的⽇期__TIME__ //⽂件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义(在VS中未定义)1000register//为 register这个关键字,创建⼀个简短的名字for;;//⽤更形象的符号来替换⼀种实现break;case。
2023-10-06 20:01:23
42
原创 编译和链接
编译过程就是将预处理后的文件进行一系列的:词法分析、语法分析、语义分析及优化,生成相应的。将源代码程序被输⼊扫描器,扫描器的任务就是简单的进行词法分析,把代码中的字符分割成⼀系列。汇编器是将汇编代码转转变成机器可执⾏的指令,每⼀个汇编语句几乎都对应⼀条机器指令。静态语义分析通常包括声明和类型的匹配,类型的转换等。链接是⼀个复杂的过程,链接的时候需要把⼀堆文件链接在⼀起才⽣成可执行程序。据汇编指令和机器指令的对照表⼀⼀的进行翻译,也不做指令优化。在ANSI C的任何⼀种实现中,存在两个不同的环境。
2023-10-05 20:07:54
37
原创 编程100题(6)
你需要将摄⽒度转换为 开⽒度(Kelvin)和 华⽒度(Fahrenheit),并以数组 ans = [kelvin,fahrenheit] 的形式返回结果。输⼊的guess数组为小A 每次的猜测, answer 数组为小B 每次的选择。解释:数组 nums 为 [0, 2, 4, 6, 8],其中 (0 ^ 2 ^ 4 ^ 6 ^ 8) = 8。• 示例 1: 输⼊:guess = [1,2,3], answer = [1,2,3]输⼊:guess = [2,2,3], answer = [3,2,1]
2023-10-03 20:04:23
33
原创 编程100题(5)
写⼀个函数my_strcpy,实现拷⻉字符串的功能,假设给定⼀个字符数组a,再给定⼀个字符数组。输⼊包含三⾏,第⼀⾏包含两个正整数n, m,⽤空格分隔。先输⼊10个整数存放在数组中,再输⼊⼀个整数n,删除数组中所有等于n的数字,数组中剩余的数。输出为⼀⾏,输出⻓度为n+m的升序序列,即⻓度为n的升序序列和⻓度为m的升序序列中的元素重。输⼊⼀个字符串,判断这个字符串是否是回⽂字符串(字符串的⻓度⼩于等于30,字符串不包含空。输⼊y和m两个整数,y表⽰年份,m表⽰⽉份,计算y年m⽉有多少天,并输出天数。
2023-09-29 19:55:53
44
原创 C语言文件操作
磁盘上的文件是文件。程序文件、数据文件(从文件功能的⻆度来分类的)。功能函数适用于fgetc字符输⼊函数(一次读取一个字符)所有输⼊流fputc字符输出函数(一次写入一个字符)所有输出流fgets⽂本⾏输⼊函数(一次读取一行字符)所有输⼊流fputs⽂本⾏输出函数(一次写入一行字符)所有输出流fscanf格式化输⼊函数所有输⼊流fprintf格式化输出函数所有输出流fread⼆进制输⼊⽂件fwrite⼆进制输出⽂件。
2023-09-27 19:37:27
57
原创 动态内存管理
栈区(stack):在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率很⾼,但是分配的内存容量有限。栈区主要存放运⾏函数⽽分配的局部变量、函数参数、返回数据、返回地址等。堆区(heap)动态内存分配,⼀般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。分配⽅式类似于链表。数据段(静态区)(static):存放全局变量、静态数据。程序结束后由系统释放。代码段:存放函数体(类成员函数和全局函数)的。
2023-09-20 19:57:53
36
原创 编程100题(4)
输⼊⼀个字符串(字符串⻓度⼩于等于30,中间不包含空格),使⽤Strlen函数可以求字符串的⻓度,并返回。写⼀个函数Strlen,可以求字符串⻓度,注:字符串的结束标志是 \0 .输⼊⼀个字符串(字符串⻓度⼩于等于30,中间不包含空格),使⽤Strlen函数可以求字符串的⻓度,并返回。输⼊2个整数m和n,写⼀个函数average,求2个整数的平均值,考虑整数过⼤溢出的问题。输⼊⼀个字符串,写⼀个函数将⼀个字符串的内容逆序过来。输⼊⼀个整数m,求这个整数m的每⼀位之和,并打印。输⼊:abc defghi。
2023-09-19 20:05:27
34
原创 自定义类型:联合和枚举
联合的成员是共⽤同一块内存空间的,这样⼀个联合变量的大小,至少是最大成员的大小(因为联合。写⼀个程序,判断当前机器是大端,还是小端。这就充分说明联合体是共用一个空间的。⾄少得有能力保存最大的那个成员)。中的内容是枚举类型的可能取值,也叫。
2023-09-13 19:31:42
43
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人