自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 排序----基数排序、桶排序(附排序总结)

建立一个指针数组,指针指向一个链表,然后再对链表排序。永远只建立一个筒,只适用于全是两位数或者全是三位数的排序。从个位开始往高位不断排序,把各个数字按每一位的顺序排起来。当对结构体排序的时候,稳定性变得很有意义。稳定性:一般排序的时候需要跨位置就不稳定了。归并排序当相等的时候取前一个就稳定了。

2024-09-24 20:26:39 230

原创 排序-----计数排序(非比较排序)

所以要相对映射,不要绝对映射。存在的问题:数组空间浪费。

2024-09-24 19:59:20 143

原创 排序----归并排序(非递归版)

但是我们测试的时候会发现这样一个问题,begin和end的值会存在越界的问题,而且只有begin1不会越界,因为begin1是受for循环中i的控制的。这种情况下,只有前两组归并了,但是后两组没有归并,如果是全都归并完了再整体拷贝,那么原数组中的8 9会被覆盖,就产生丢失数据的问题了。所以当我们遇到begin越界了就不用管了,遇到end越界就修正一下。如图代码为11归并的示例,用for循环来解决。每一次往前递归的前一小部分内部已经是有序的了。

2024-09-24 18:41:14 271

原创 排序-----归并排序(递归版)

核心思想:假设数组前后两部分各自有序,然后各定义两个指针,谁小谁放到新开辟的数组里面,最后把新开辟的数组赋值给原数组就完成了。要使前后两部分有序就采用递归的方式,不断往下划分块,最后一层划分为两个元素一组或者一个元素一组,这样一层一层地往上递归排序,就实现了整个有序。时间复杂度:O(N*logN) 因为是递归,递归了logN层(二叉树高度),每一层比较N次。注意:以下的分块方法会出现问题,[2,3]这个区间一直存在,会死循环,进而栈溢出。空间复杂度:O(N) 多开辟了tmp数组的空间。

2024-09-22 21:41:04 343

原创 排序----快速排序(快排)(非递归版)

举例:我们首先进行0~9的遍历,然后key最后放到5这个位置,之后便被分成了0~4和6~9这两个区间,但是我们不想用递归的方式写,那就把0 4和6 9这四个数据压入栈中,每次取栈顶数据进行排列。那么采用什么顺序呢?因为我们采用的是先把左子树排完再排右子树,所以先把6 9压进去,再把0 4压进去;又因为只能压入一个数据,所以先压入右边的坐标,再压入左边的坐标,就能很好的解决这个问题了。还有另一种思想(不做代码演示):如下图是一个队列,每次先进先出,那就类似于层序遍历了,是广度优先。

2024-09-22 20:25:58 173

原创 排序----快速排序(快排)(递归版)

当我们要排序的序列是一个有序序列时,我们选择第一个元素为keyi,但是end找不到比keyi的元素更小的元素,那就一直往前走,走到头和自己交换一下;在这一块数据中,记录第一个元素为key,然后设置L和R两个指针,L找比key处的元素大的,R找比key处元素小的,找到了就交换这两个位置的元素。当两个指针相遇时,若相遇点的元素比key处的值小,就把相遇点的元素与key处的元素进行交换;那么这样走完一趟的过程中,key处的元素就位于正确的位置,同时,key左侧的元素都比他小,右侧的元素的都比他大。

2024-09-21 20:54:32 381

原创 排序-----选择排序

本文介绍优化后的版本:每次遍历标记出最小的和最大的元素,分别放到前面和后面。(注意这里是找到对应的下标,然后将对应下标的数据进行交换)这个地方第一次交换就出现问题了,因为maxi和begin重叠,导致最大值并没有移动到最后。选择排序是每次都遍历,标记出最小的元素,然后把它放在前面。注意最后不要忘了begin++和end--。这个排序最好情况和最坏情况都是O(N^2)。那么问题出现在哪呢?这段代码是有问题的!

2024-09-20 21:47:56 239

原创 排序----希尔排序

然后要注意到的是内层while循环的条件,如果下一个位置的数据tmp比end这个位置的数据小,那么我们还要比较tmp是否比end-gap位置的数据小,如果还小,那么end就要一直前移gap个位置,最差的情况是end移动到了0-gap这个位置,就说明此时tmp是它及其它之前的所有元素中最小的那个,那么只需要把end+gap=0这个位置的数据赋值上tmp(0+gap及其之后的元素在while循环中已经被赋值完成了)。gap越大,大的元素就可以越快跳到后面,小的元素就可以越快跳到前面,但是越不接近有序。

2024-09-20 21:17:46 1270

原创 排序---冒泡排序、堆排序

相邻两个位置交换,假设排升序,就不断把最大的往后拿,所以这段序列从后往前变得有序。二、堆排序(数组实现)

2024-09-20 19:19:06 157

原创 排序----插入排序

一开始把第一个元素看成是有序的,然后从第二个元素开始拿出来与前面的数据比较,若前面的数据小,就把前面的数据不断后移(注意要把拿出来的那个元素提前保存下来),直到遇到比自己小的元素,然后插入到它的后面。看下面这张图,1插入的过程中end不断--,end最后等于-1,但是循环可以进行的条件是end>=0,所以会提前结束然后tmp并没有保存到下标为0的位置,这样就错了。//注意外部循环i是从0到n-2,因为你要拿出来的元素是从1到n-1,拿出来的元素下标为end+1,由此可以得出end的取值范围i。

2024-09-19 21:50:24 132

转载 最大子段和

最大子段和(分治法+动态规划法)_分治求数列的最大子段和-CSDN博客

2024-09-19 17:17:10 16

原创 数据结构---二叉树例题讲解

1出来带2.4,2出来带3.6,4出来带空.空,3出来带空.空,6出来带空.空,下一个就到空出来了,空出来的时候队列中只剩下空的话,此时该二叉树就是完全二叉树;借助队列实现,从根节点开始入队,根进去,然后把根拿出来,把根的左右孩子放进去(队尾进),再拿出队列的第一个元素(根的左孩子,没有左孩子就是右孩子),再把这个元素的左右孩子放进队尾,逐渐循环......注意:队列中存的是节点的地址,当执行QueuePop的时候,删掉的那个节点是队列的节点,并不影响二叉树的相应节点。其余代码与上一题一样。

2024-09-17 21:48:53 996

原创 函数栈帧的建立与销毁

ebp和esp这两个寄存器中存放地址,存放的地址是用来维护栈帧这个空间的。//不同编译器的这个过程是不同的,本文基于VS2013(越高级的编译器越不容易观察)* 主调函数中运行到被调函数这一条指令(call指令)时,会记录下下一条指令的地址。* 通过把值赋值给全局的寄存器,因为全局的寄存器不会随着函数的结束而销毁。(分配出去的空间需要记录地址,当操作系统回收的时候就找到这个地址)* 形参是实参的一份拷贝,值相同,但是地址不同。(电脑上的几种存储:硬盘,内存,寄存器)3.被调用的函数是如何返回的?

2024-09-16 21:30:58 101

原创 数据结构----栈与递归例题讲解

6.输入一个数N,将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,…递增顺序是指:对于两个分解序列N1​={n1​,n2​,⋯}和N2​={m1​,m2​,⋯},若存在i使得n1​=m1​,⋯,ni​=mi​,但是ni+1​<mi+1​,则N1​序列必定在N2​序列之前输出。, an是集合{1, 2, …, n}的一个排列,如果i<j且ai>aj,则序偶(ai, aj)称为该排列的一个逆序。例如,2, 3, 1有两个逆序:(3, 1)和(2, 1)。

2024-09-16 16:34:56 475

原创 数据结构------二叉树简单介绍及实现

/这段二叉树的递归代码编译完了之后是一份指令,这份指令会自己调用自己,不断建立栈帧,然后销毁栈帧。// 实现查找,最多找高度次(类似二分法)//同一个函数不同的值递归占用的空间是一样的,因为销毁了之后再接着用。//二分查找存在的问题:排序;必须对数组操作,插入删除不方便。//搜索二叉树:左子树的所有值比根小,右子树的所有值比根大。如果不是满二叉树或者完全二叉树,就要用链式存储。//不能递归的深度太深,不然会导致栈溢出。

2024-09-12 20:41:18 209

原创 数据结构——二叉树(堆)

/法二:建k个数的小堆,然后往后取数据,该数据大于堆顶数据就将堆顶数据替换为该数 // 据,然后进堆进行向下调整。//找左右孩子中更小的节点进行数值交换,知道符合小/大堆,或者走到了叶子节点(该位置处坐标*2+1是否超出数组范围)//这样不断找堆顶元素的过程就是不断从小的数开始往外pop,时间复杂度好,但是空间复杂度为O(N),这样不好。//因为向上调整的过程中,child的下标最终在parent的下标之上,所以,判断条件应该改成child>//二叉树的高度计算公式。

2024-09-09 21:40:05 264

原创 数据结构——栈和队列

这个pushst和popst都不能是指针类型,因为后续要给这个结构体malloc,如果是指针的话,tmp malloc出来的空间里面放的都是指针的大小,指针的大小是固定的字节数(4/8),这个地方只有用栈对象才可以访问栈里面的元素。//也不能把他定义成全局或静态,因为测试用例可能会调用好几次create函数,但是定义成全局或者静态的之后底层就只有那一个空间,程序就不对了。//思路:把数据都存放在pushst中,popst专门用来出数据,当popst中空了之后,就把pushst中的数据移动到popst中。

2024-09-08 19:27:08 512

原创 数据结构初阶---复杂度

/把数字展开成二进制的形式,每个二进制位出现了两个1就会归0,最后每一个二进制位剩下的数字1算出来就是那个只出现一次的数字。//不可行,冒泡O(N^2),qsort(快排)O(n*logn)----->都不可行。//思路二:计算0~n的所有数字和,再减去数组中的每个数据,剩下的数字就是缺了的数据。//规律:N-(2的几次方)=进入的第几层Fib(即Fib()括号中的数字)//思路一:使用普通的O(N^2)算法,会超时!//改进方法:把递归变循环//时间复杂度变为O(N)//训练题1:消失的数字。

2024-09-05 21:53:11 215

原创 数据结构------链表例题讲解

/先找到中间节点(快慢指针的方法//结束条件注意想到奇数个或者偶数个结点的时候),然后将中间节点及以后的节点逆置(注意创建一个空指针newhead,就是最后的最后一个节点指向的空指针,一个cur指针遍历即改变它的指向,一个next指针保存原来的cur的下一个节点,cur指针是否为空就是判断结束的条件)一下得到rmid(逆置之后的中间节点),将rmid和head节点指向的数据不断比较,不相等就结束,结束条件是当一个指针为空该指针的时候。//代码//注意控制random中copy的random是如何赋值的。

2024-09-05 21:52:53 413

原创 数据结构-----链表

/在Contact.c文件中肯定会用到Contact.h中的内容,这个肯定要包含,同时,因为对通讯录操作就是对顺序表进行操作,可以节省一些步骤,所以也要包含SeqList.h文件。//当只有一个结点的时候,这一个节点被释放了,就不能再用next来指向下一个了,会非法访问。//这是错误的,把pos->next释放掉了,就相当于把pos->next->next释放掉了,导致pos为野指针。//三个指针,两个分别指向两个数组的最后一个有效元素,另一个指针指向合并后nums1的最后一个位置。

2024-09-01 18:52:14 747

原创 数据结构---分割链表

若pcur节点的值大于或等于x,将该节点尾插到原链表后,prev->next=pcur->next,free(pcur),pcur=prev->next;注意::一定要处理好大链表的尾节点,它未处理的话有可能使链表出现环,进而导致死循环。newptail记录改变后的链表的尾节点,即每次都往它后面接。为了减少代码,增加一个头节点,头节点之后的链表为新链表。若pcur节点的值大于或等于x,尾插在新链表中。~~~最好的思路:创建新链表:小链表和大链表。若pcur结点的值小于x,头插在新链表中。

2024-09-01 18:38:14 483

原创 数据结构------约瑟夫问题

··循环列表的经典应用-------环形链表的约瑟夫问题。

2024-09-01 18:21:42 379

原创 数据结构------合并两个有序链表

新链表是通过拼接给定的两个链表的所有节点组成的。法一:创建一个空链表,比较两个链表的元素,谁小把谁放进去。将两个升序链表合并为一个新的。//该代码便于理解,但重复代码过多。

2024-09-01 16:40:14 221

原创 数据结构------链表的中间节点

while(fast&&fast->next)//不能交换位置,否则就对空指针解引用了!

2024-09-01 15:26:16 127

原创 数据结构------反转链表

/链表为空或者只有一个节点。//思路一:迭代,三指针。

2024-09-01 14:31:12 278

原创 数据结构------移除链表元素

while(prev&&prev->val==val)//这两个条件的判断顺序不能变。/* 头节点不是待删除的节点,头节点后面挂接已处理的链表(更短的) *///审题:val是一开始就定的数,而不是你想当然的数组下标!/* 找到值为 val 的节点,并将其删除 *///思路一:遍历原链表,将值为val的节点释放,用三个指针存放。//判断去了开头的等于val的节点之后链表是否为空。/* 没找到,则继续遍历查找 *//* 删除头节点后所有值为 val 的节点 *///链表不为空时去除中间的是val的节点。

2024-09-01 13:11:21 952

原创 c++期末复习代码

1.C++中,可以使用getline函数输入一行字符(含空白符);输入一个字符串。-----注意输入形式 判断是否是回文串当使用cin读取键盘输入时,遇到空格、制表符或回车键时停止读取。这意味着如果输入的字符串中包含空格,cin只会读取并输出空格之前的字符。//输入:Zhang San2024 9 8b//输出:Zhang San;2024-9-8;Bachelo。

2024-08-11 16:15:22 982

原创 STL--vector

实现可变矩阵相乘的三种方法。

2024-06-02 13:45:50 107

原创 STL--stack

【代码】STL--stack。

2024-06-02 13:44:23 124

原创 STL--map

2.输入每种商品的价格,输出每类商品的总价格。

2024-06-02 13:42:45 190

原创 C++期中复习

///构造函数调用顺序:先调用父类的构造函数,再调用组合对象的构造函数(按照对象成员的定义顺序),再组合类的构造函数 (////先调用父类的组合的构造函数,再调用父类的构造函数,之后调用子类的组合的构造函数,最后调用子类自身的构造函数;////静态数据成员在类外初始化,所有对象共有的,普通成员函数可以直接访问类中的静态数据成员,静态成员函数(属于整个类,无this指针,指向当前对象)只能访问静态数据成员不能访问普通数据成员。

2024-06-02 13:40:04 927

原创 c语言循环和选择语句

1.()中条件为真时一直执行,可以用break永久终止循环;用continue时,只是终止本次循环,即循环体中语句continue以下的不会运行,但下一次循环还能运行。2.建议不在for循环体内修改循环变量,防止for循环失去控制。适用于多重for循环,然后内层循环条件成立需要跳出全部循环时。3.有时针对一个变量有多种情况时,用switch语句更方便。*循环结构:for、while、do while。1.for(初始化部分;1.else是和离他最近的if匹配的。while(表达式);do while语句。

2023-12-03 14:54:43 70 2

原创 Introduction

2.想要在大一上学完c语言,寒假学习数据结构、算法等。1.我是Ms.Zhu,一名计算机专业大一新生。4.在完成作业的基础上刷洛谷,回顾所学内容。3.每天都要进行一定的代码练习。5.暂时想要走考研这条路。

2023-11-19 16:13:28 38

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除