- 博客(118)
- 收藏
- 关注
原创 堆排序
堆排序基本思想:严格来讲,堆有不同的种类,我们主要用的还是二叉堆,而二叉堆有最大堆和最小堆之分。最大(最小)堆是一棵每一个节点的键值都不小于(大于)其孩子(如果存在)的键值的树。大顶堆是一棵完全二叉树,同时也是一棵最大树。小顶堆是一棵完全完全二叉树,同时也是一棵最小树。大堆小堆堆的相关操作以最小顶堆为例:① 向下调整:从根开始,选取当前结点 p 的较小的儿子结点;如果其值比 p...
2019-04-23 20:07:12
176
原创 归并排序
归并排序基本思想:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。很明显我们可以意识到它有两个重要步骤1、向下分治2、向上合并让我们来看看具体的归并排序示...
2019-04-23 19:30:17
153
原创 无敌快排
快速排序既然人家名称就叫快速排序,那么自然排序速度快,但是快也是相对而言的,不过大家知道就行了,这是哲学问题,万事万物都是相对的,原谅我也不咋的懂哲学,换一种不同的场景,也许它并没有其它常见排序算法快。~~接下来让我们看看快速排序到底是什么样的-基本思想这就是快排的基本思路,那么到底如何让比基准值小的在左边,比基准值大的在右边呢?这里我给大家介绍两种种方法。快排一 : 利用Hov...
2019-04-23 19:05:14
214
原创 扑克牌式插入排序及升级版希尔排序
插入排序问题提出:为什么叫做扑克牌式插入排序这里我就得给大家解释一下,为什么我要叫做扑克牌式插入排序,很简单,小编本人喜欢打扑克牌。。。相信扑克牌大家应该都不会陌生,打扑克牌其实不仅仅是娱乐,同时也能帮我们锻炼自己的思维能力。因为对于一个扑克牌高手而言,一切尽在掌握中,对方有什么牌,我怎么样能取胜,经过概率推算,就很容易打败对手,有机会有时间大家可以和朋友们切磋一下。。 尴尬 扯的有点远...
2019-04-23 17:19:10
377
原创 专治拖延症--选择排序
选择排序来来来,看看,是不是被我高端大气上档次的标题忽悠进来了,既然来了,那么就花几分钟看看,可能你并不太关注的选择排序。可能生活中大多数人都有选择困难症,一直拖拖拖,最后还是不知道选择那个。那么今天我就给大家分享一下数据结构中的选择排序,让你如何正确高效的对我们的数据做出正确的选择。基本思想:选择排序它就是每次从我们的序列中选择出一个最小或者最大的数放置我们的序列起始位置,直到数据全部有...
2019-04-23 16:32:43
169
原创 你真的了解冒泡排序吗?
冒泡排序顾名思义,冒泡排序就像吐泡泡一样,泡泡会越来越大,对应我我们的排序算法中,就是将我们的最大数沉淀。说到泡泡。。。 不由得让我想起了网红语~~~ 香啊、造啊、香皂啊,吃完吐泡泡。 哈哈!基本原理冒泡排序是一种交换排序的简单排序算法,它是将相邻的两个元素比较,将比较大的元素向后移动,较小的元素向前,类似于我们的冒泡泡,所以冒泡排序就诞生了,它的思想比较简单,易理解,很适合于初学者学...
2019-04-20 22:01:11
221
原创 根据二叉树的前序中序构建二叉树
构建二叉树构建二叉树,这是个比较繁琐的问题,假如我们知道二叉树的先序及中序遍历我们能不能构建二叉树呢?答案肯定是能得,这不废话么,不能得话我就得换我的标题了。为什么能根据先序以及中序构建一棵二叉树呢?答案显而易见,开始我也不知道,哈哈,但是我根据先序以及中序遍历将二叉树画出来了,那就说明当然可以,后来我又仔细观察了二叉树的先序以及中序序列,我们会发现先序序列中根很容易找到,因为第一个元素就...
2019-04-20 15:59:45
7977
4
原创 二叉树的层序遍历
二叉树层序遍历说完了二叉树的先序、中序以及后序遍历方法,那么我们再来谈一谈二叉树如何层序遍历请看大屏幕 。。。。上图是一棵二叉树,层序遍历结果:1 2 3 4 5 6咦,我想你可能会疑惑什么叫做层序遍历,其实很简单,就是按照一层一层的去遍历二叉树,这就很容易理解了。首先让我们来看看如何去层序遍历二叉树#include <queue>vo...
2019-04-20 15:31:18
11886
1
原创 二叉树的后序遍历(递归与非递归)
二叉树后序遍历介绍了二叉树的先序以及中序遍历,那么我简单的再给大家介绍了一下二叉树的后序遍历。请看大屏幕 。。。。上图是一棵二叉树,后序遍历结果:4 5 2 6 3 1同理,我想你可能会问什么叫做后序遍历,其实很简单,就是按照 左 -》 右 -》 根 的方式去遍历二叉树。首先让我们来看看如何递归的去后序遍历二叉树注:在这里我特别...
2019-04-20 15:06:39
4052
原创 二叉树的中序遍历(递归与非递归)
二叉树中序遍历上篇我简单的给大家介绍了一下二叉树的先序遍历,那么这次我就给大家介绍一下二叉树的中序遍历请看大屏幕 。。。。上图是一棵二叉树,中序遍历结果:4 2 5 1 3 6同理,我想你可能会问什么叫做中序遍历,其实很简单,就是按照 左 -》 右 -》 根 的方式去遍历二叉树。首先让我们来看看如何递归的去中序遍历二叉树注:在这里我特别强调一点...
2019-04-20 14:55:59
2702
原创 二叉树前序遍历(递归以及非递归)
二叉树前序遍历对于一种数据结构而言,我们最常见的就是遍历,那么关于二叉树我们该如何去遍历呢?请看大屏幕 。。。。上图是一棵二叉树,前序遍历结果:1 2 4 5 3 6咦,我想你可能会异或什么叫做前序遍历,其实很简单,就是按照 根 -》 左 -》 右 的方式去遍历二叉树。首先让我们来看看如何递归的去前序遍历二叉树注:在这里我特别强调一点,在我们二...
2019-04-20 14:46:44
3775
原创 哇! 二叉树
二叉树提到二叉树,那我们就不得不说一下什么是二叉树了,正如标题所说,两个叉的树。。。。概念一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。二叉树的特点:每个结点最多有两棵子树,即二叉树不存在度大于2的结点。二叉树的子树有左右之分,其子树的次序不能颠倒。现实生活中的二叉树对的没错,这就是我们现实生活中的二叉树。。。...
2019-04-20 14:15:14
279
原创 带有随机指针链表的复制
链表复制上次介绍了关于链表的相交与求环问题,这次我来给大家介绍一个让我脑瓜子嗡嗡的复杂链表的复制问题。。 说实话,链表也太狂野了,太会玩了,都快赶上苏大强了。。。。。。我的个天,画了半天,别介意,本人画画水平不是特别高,大家凑合看。如上图所示,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。现在要求返回这个链表的深拷贝。这该怎么办呢,一开始我也一头雾水,这是个...
2019-04-18 21:56:43
1616
原创 链表相交与链表求环
链表相交与求环初看链表相交与链表求环,我还懵的,什么是链表相交?链表还能相交,什么是链表求环,链表还能求环,哈哈,直到看到这个。。。。。链表中有环看到这个图我才发现链表还可以这么玩,涨知识了。。不过同时看到这道题之后,也是勾起了浓厚的兴趣,那么我们到底该如何判断链表相交与链表求环呢- 首先我们来说一下链表相交的问题开始看到这个问题的时候我也挺懵的,不知道如何去解决这个问题,不过只要你...
2019-04-18 13:59:40
245
原创 链表的回文结构
回文链表在我们的生活中经常会碰到这种回文的结构,回文就是反转以后和以前一样的就是回文结构,例如 1->2->3->2->1,我们将它反转之后还是与原链表一样,我们就称这种链表结构为回文结构,那么如何来判断一个链表它是不是回文链表呢?解决方案1、采用头插法将链表逆置,将整个链表反转过来,判断是否与原链表一样即可2、升级版:既然它要是回文结构,我们只需要将链表...
2019-04-18 13:12:21
8810
1
原创 删除链表中重复的节点
删除节点链表中的增删是最常见的问题,那么我们如何在一个完整的链表中删除重复的节点呢?例如:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。遇到链表的问题别慌,相信自己只要你能想得通就能写的出来,而最好的办法莫过于画图...
2019-04-18 12:45:18
342
原创 小小的链表其实并不简单
链表概念:链表也是我们最常使用的一种数据结构,它是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。分类单向链表、双向链表带头的链表、不带头链表循环链表、非循环链表等让我们来看看链表到底是什么样子的上图就是我们最常用的单向链表及双选购链表的示意图。很明显链表这种数据结构它是通过一种手段将我们的数据串起来,所以在数据在存储的时候它...
2019-04-16 22:49:23
128
原创 顺序表的相关操作
线性表概念:线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。顺序表概念:顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,...
2019-04-16 22:24:25
147
原创 Linux动态库与静态库的创建和使用
编译过程提及动态库与静态库,那么我们首先就要来说一下在我们Linux下程序的编译过程预处理 ( -E )(a) 头文件展开(文本复制)(b)进行宏替换©条件编译(d)去掉注释编译 ( -S )语法语义纠错,无误后将源代码文件转换成汇编代码文件汇编 ( -c )将汇编代码转换成二进制机器代码链接将所有得到的目标文件和依赖的库文件进行汇总...
2019-04-13 14:22:36
535
原创 Linux之命名管道及其使用
管道匿名管道:可以用于有血缘关系之间的进程间的通信(pipe)命名管道:可以用于任意进程间的通信(fifo)此前我已经详细介绍过了匿名管道与命名管道的基本用法及其原理,这次我主要介绍一下如何利用命名管道来实现进程间的通信。命名管道:为管道创建一个管道文件,这个管道文件就是管道的名字,但实质还是内核中的缓冲区。建立管道文件#include <sys/types.h>...
2019-04-13 13:15:10
7204
原创 Linux文件系统与软链接硬链接
Linux下文件系统磁盘上文件的管理系统,磁盘上除了交换分区外都有一个文件系统,如下图所示这里我以ext2文件系统为例,介绍一下文件系统,如图Linuxext2文件系统,上图为简略磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block...
2019-04-11 22:19:32
390
原创 Linux之IO系统调用接口与文件描述符
系统调用接口open接口1、 头文件#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>2、函数原型int open(const char *pathname, int flags);int open(const char *pathname, int flags, mod...
2019-04-11 21:24:50
225
原创 Linux进程通信——共享内存(共享存储映射)
共享存储映射文件进程间通信存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。于是当从缓冲区中取数据,就相当于读文件中的相应字节。于此类似,将数据存入缓冲区,则相应的字节就自动写入文件。这样,就可在不适用read和write函数的情况下,使用地址(指针)完成I/O操作。使用这种方法,首先应通知内核,将一个指定文件映射到存储区域中。这个映射...
2019-04-09 22:09:20
724
原创 Linux进程间通信——管道
IPC方法概念:Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcessCommunication)。进...
2019-04-09 18:55:08
440
原创 MI SHELL--简易版的迷你shell
迷你shell实现shell:命令行解释器,就是对我们输入的命令进行解释,实现命令功能思路1、等待标准输入2、解析输入数据3、判断是否内建命令4、创建子进程进行程序替换5、回收子进程具体代码实现1 //shell 2 //1、等待用户输入 3 //2、解析输入数据 【ls】【-l】 4 //3、创建子进程 5 //4、等待子进程退出(重复) 6 #inc...
2019-04-06 13:23:12
438
原创 Linux程序地址空间及库函数与系统调用接口
程序地址空间概念:程序地址空间也叫虚拟地址空间,在Linux下,每运行一个程序即一个进程,操作系统都会为其分配一个虚拟的地址空间,在32位操作系统下,操作系统分配的虚拟地址空间为0~4G。进程的内存描述符(mm_struct):每个进程都有一个mm_struct,它是一个结构体,我们也把它叫做内存描述符,Linux就是通过这个结构体实现对内存的管理,mm_struct就是用来描述一个进...
2019-04-06 13:03:52
252
原创 Linux进程等待进程终止与程序替换
进程等待概念:进程等待就是子进程的状态改变作用:避免产生僵尸进程。一个进程在终止时会关闭所有的文件描述符,释放分配在用户空间的内存,但退出原因还保存在PCB中,如果该进程是正常终止,那么它的退出状态就会保存在PCB中,若果该进程不是正常终止,则会将导致进程异常终止的信号保存在PCB中。那么父进程便可以通过调用wait()函数或者waitpid()函数来查看子进程退出信息,然后可以彻底清...
2019-04-05 17:51:39
711
原创 Linux进程状态环境变量与僵尸进程
进程状态进程基本的状态有5种。分别为初始态,就绪态,运行态,挂起态与终止态。其中初始态为进程准备阶段,常与就绪态结合来看。很多时候我们也把进程状态分为三种,即运行态、就绪态、阻塞态。如图所示。Linux下进程状态R (运行状态)S (可终端睡眠态)D (不可中断睡眠态)T (停止态)t (追踪态)X(死亡状态)Z (僵尸态/僵死态)僵尸进程概念:处于僵死态的进程就...
2019-04-01 22:36:45
497
2
原创 Linux进程创建之fork()函数
进程创建如何创建一个子进程通过复制调用进程,创建一个新的进程,我们称这个新的进程为子进程。复制的是父进程的PCB,因此父进程与子进程的关系就为代码共享,数据独有。具体实现方法通过调用fork()函数 函数原型 pid_t fork(void)返回值创建子进程成功,则有了两个进程,那我们如何对这两个进程进行区分呢,那便是通过fork()函数的返回值来判断,对于父进程返回...
2019-03-30 18:20:47
570
2
原创 Linux进程概念
操作系统概念:操作系统是一个软件,是管理和控制计算机硬件与软件资源的计算机程 序,它的目的就是为了让计算机更加的好用,方便用户对计算机的使用。Linux概念:Linux操作系统是一个多用户多任务的一个开源的操作系统。库函数与系统调用接口概念:库函数是对系统调用接口的一层封装,他们是上下级调用关系,库函数调用了系统调用函数。进程与程序程...
2019-03-30 17:42:07
159
原创 Linux之gcc/gdb
gccgcc工作流程1. 预处理 gcc -E2. 编译 gcc -S3. 汇编 gcc -c4. 链接 没参数-o: 指定生成的文件的名字-D: 在编译的时候定义宏(控制log的输出)-I: 指定头文件的路径-g: gdb调试的时候需要添加该参数-O: 编译优化, 3个等级 -O(1-3)-Wall: 编译期间输出警告信息gdbgdb调试:启动gdbst...
2019-03-23 22:22:14
239
1
原创 Linux之vim
vim在Linux下,vim共有12种操作模式,但我们最常用的有三种模式,如下普通模式 (命令模式)底行模式 (末行模式)编辑模式 (插入模式)工作模式:1. 命令模式 – 打开文件之后, 默认进入命令模式2. 编辑模式 – 需要输入一些命令, 切换到编辑模式3. 末行模式 – 在末行模式下可以输入一些命令vim编辑器的使用命令模式下的操作: 1>. ...
2019-03-23 22:09:47
140
原创 Linux基础命令操作
Linux基础命令操作Linux 基础Shell、 Bash 学名叫什么?命令解析器Shell 和 Bash的关系?Shell – unixBash – linux在linux终端下使用什么键来补齐命令或者路径?a) Tab当前用户所在目录为/home/itcast/ 此时按两侧tab键会看到什么效果?a) 类从此目录下的所文件和目录终端下, 查看上一条记录的快捷键?a)...
2019-03-23 21:42:30
197
原创 Linux文件类型及重要目录
重要目录在Linux命令行下输入 ls / 就会出现许多目录,在这里我来列举一点常见的目录 ls / //查看根目录下的内容/bin:bin是Binary的缩写, 这个目录存放着我们最经常使用的命令,例如ls 、cp 等/boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev :dev是Device(设...
2019-03-23 21:25:46
287
原创 Linux之常用基础指令二
常用的Linux相关基础指令二1、cat功能:查看目标文件的内容使用方法:cat [选项参数][文件]常用选项参数:-b 对非空输出行编号-n 对输出的所有行编号-s 不输出多行空行2、more功能:功能类似cat,查看文件内容(分页显示)使用方法:more [选项参数][文件]常用选项参数:-n 对输出所有行编号q 退出more指令3、less功...
2019-03-12 17:15:17
117
原创 C语言编写简单的朗读小工具
朗读小工具大家可能和我一样,在学完c语言之后,觉得很枯燥,今天无聊之时,我就将理论结合实践一下,做一个简单的c语言朗读器。(此处结合vbs脚本,保证很简单,人人都能够学会)包含c语言基础知识c语言基本框架c语言基本输入输出c语言文件相关操作c语言system函数vbs指令CreateObject(“SAPI.Spvoice”).Speak " " 此处为简单的朗读指令...
2019-03-10 22:34:09
1999
1
原创 Linux之常用基础指令一
初识Linux常用Linux的相关命令1、ls 指令功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息使用方法:ls [选项参数] [目录或文件](以下为常用选项参数)-a 列出目录下的所有文件,包括以 . 开头的隐含文件(Linux下以.开头的文件为隐藏文件,默认不显示)-l 列出文件的详细信息-t 以时间对目录下文件进行...
2019-03-09 18:14:37
153
原创 C语言之简单桶排序
说到排序,生活中无处不在,比如身高,成绩等等。在我们学习语言中排序也是最热门的一个话题,那么我今天来就给大家分享一下简单的桶排序。估计大多数人听到桶排序这三个字时和我一样是懵的,因为我们最熟悉的莫过于冒泡排序,插入排序,快速排序等,桶排序到底是个神马东东。今天看到这个排序时,确实觉得它很牛,所以来和大家分享一下。例:有6个同学考试成绩为 2 5 1 9 5 8 分,满分10分,现要求对其排序按...
2019-03-06 23:34:49
1590
原创 C语言总结六(结构体)
一、结构体1、结构体类型的声明2、结构体初始化3、结构体成员访问4、结构体传参二、结构体的声明1、结构的基础知识结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。2、结构的声明例如描述一个学生:结构成员的类型结构的成员可以是标量、数组、指针,甚至是其他结构体。结构体变量的定义和初始化有了结构体类型,那如何定义变量,其实很简单。struct ta...
2019-02-26 20:57:52
324
原创 C语言之找数组中重复的数
要求如下:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路:拿到题目一看,感觉不是特别难,重复的数字怎么找出来,既然数字相同,那么必定相减为零,这便是最简单的思路,我们遍历...
2019-02-25 20:57:20
21135
4
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅