自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 学习随记五十二——十种基本的排序算法比较

基本的排序算法插入排序希尔排序堆排序归并排序快速排序计数排序基数排序桶排序十种基本的排序算法基本的排序算法前言1、基本的排序算法实现原理和算法描述及其代码1.1 冒泡排序1.2 选择排序1.3 插入排序1.4 希尔排序1.5 堆排序1.6 归并排序1.7 快速排序1.8 计数排序1.9 基数排序1.10 桶排序2、 基本排序算法的时间、空间复杂度分析3、各种排序算法的运行实例对比总结前言  数据排序是指按一定规则对数据进行整理排列, 为数据的进一步处理做好准备。在计算机领域主要使用的

2021-06-16 20:27:00 225

原创 学习随记五十一——桶排序

桶排序前言1、桶排序的算法描述2、桶排序的函数实现3、桶排序的运行分析3.1 时间复杂度3.2 运行实例分析4、整体代码总结前言  计数排序、基数排序与桶排序有很多相似的地方,其中都用到了桶子储存数据的思想。1、桶排序的算法描述  桶排序其实就是将元素按一定范围分割,然后装到一个个桶子中,桶子是有序的,再将桶子中的元素进行排序(对桶子中的元素可以使用其他排序方法,如快排,归并,插入,冒泡等,也可以递归地把元素再分割到一个个更小地桶子中直到每个桶子中最多只有一个元素,然后回溯即可),最后将桶子按照

2021-06-14 21:59:13 223 5

原创 学习随记五十——基数排序

基数排序1、基数排序的算法描述2、基数排序的函数实现3、基数排序的分析3.1 时间复杂度分析3.2 运行实例分析4、整体代码总结注:我测试所用数据都是可以比较大小的类型且无重复元素,且排序按照升序排列。前言:基数排序可以说是桶排序的一种特殊变型,它的基本思想也是利用了“桶子”.(桶子在概念上就是类似数组的容器,在这里我用数组来制造桶子)1、基数排序的算法描述  基数排序总共执行最高位轮,每次从最低位开始比较一直到最高位,元素不足的用0补齐,然后用一个数组记录各个桶子中的元素个数,每次按顺序放入各个

2021-06-13 19:08:58 211

原创 学习随记四十九——计数排序

计数排序1、计数排序的算法描述2、计数排序的函数实现3、计数排序的分析3.1 时间复杂度分析3.2 运行实例分析4、整体代码总结注:我测试所用数据都是可以比较大小的类型且无重复元素,且排序按照升序排列。前言:计数排序是一种线性时间复杂度的排序算法,前面的插入排序,归并排序,快速排序等等都是属于比较排序,而计数排序不是比较出来的是算出来的。1、计数排序的算法描述  为了避免空间的过多浪费,先遍历一遍待排序数组,找出其中的最大值和最小值,则计数数组的长度等于最大值减最小值加1(数组从0开始计数),将计数

2021-06-13 09:18:32 97

原创 学习随记四十八——递归实现快速排序

递归实现快速排序1、快速排序的算法描述2、快速排序的函数实现3、快速排序的分析3.1 时间复杂度分析3.2 运行实例分析3.3 整体代码总结注:我测试所用数据都是可以比较大小的类型且无重复元素,且排序按照升序排列。  前言:快排的思想其实和冒泡排序很像,冒泡排序是通过相邻两个元素间的不断交换最终完成排序,我觉得快速排序其实可以理解为从两个相邻的元素开始再发展到两段相邻的数组片段依次回溯进行比较,最终完成排序。1、快速排序的算法描述  快排和归并排序一样运用了递归的典型思想——分治。我先选取一个枢纽元

2021-06-12 18:14:36 259 4

原创 学习随记四十七——递归实现归并排序

递归实现归并排序#include<stdio.h>#include<time.h>#include<stdlib.h>#include<math.h>typedef int ElementType;const int N=1000000;void Swap(ElementType*,ElementType*);void Randomize(ElementType [],int); //随机化一个数组,参数为数组地址和长度 void

2021-06-09 20:51:16 278 2

原创 学习随记四十六——堆排序

堆排序1、堆排序算法分析2、堆排序代码3、堆排序分析1、时间复杂度2、运行时间实例分析3、整体代码总结注:我测试所用数据都是可以比较大小的类型且无重复元素,且排序按照升序排列。1、堆排序算法分析  我们可以通过建立一个二叉堆来对元素进行排序,有两种思路,一是先将这些元素建立一个二叉堆,执行N次删除最大元素的操作,用一个数组接收被删除的数据,这样就得到了元素的升序排列。这个算法的主要问题就是使用了一个附加数组,增大了空间开销,第二种实现方法是因为每次删除最大元素后堆的长度减1,所以可以将被删除的元素放在

2021-06-08 12:35:20 268

原创 学习随记四十五——希尔排序

希尔排序1、希尔排序的算法2、希尔排序的函数代码3、希尔排序的分析一些说明:在这里我假设的数组元素可以比较大小,且无重复元素,按照升序进行排序。1、希尔排序的算法  希尔排序属于比较相距一定间隔的排序算法。  核心思想:比较的间隔逐渐减小直到最小间隔为1,只比较相邻元素的最后一趟排序为止。由于这个原因希尔排序有时也被叫做缩小增量排序(diminishing increment sort).  我的算法描述:首先选择一个最小增量为1的增量序列。每次令当前增量为初始位置开始比较直到数组末尾;每次用一

2021-06-02 19:11:14 126 3

原创 Linux学习记录六——重定向

重定向前言一、基础知识介绍1.1 什么是标准输入、标准输出、标准错误1.2 标准输出重定向1.3 标准错误重定向1.4 将标准输出和标准错误重定向到同一个文件1.5 处理不想要的输出1.6 标准输入重定向cat——合并文件二、命令介绍1.引入库2.读入数据总结前言  本篇文章我们将要探索命令行最酷的功能——I/O(input/output)重定向。这个功能可以把命令行的输入输出重定向为从文件中获取内容,也可以把命令行的输出结果重定向到文件中。如果我们将多个命令行关联起来,将形成非常强大的命令——管道

2021-06-01 23:30:44 284 2

原创 学习随记四十四——插入排序

插入排序的详细分析1、插入排序的算法2、插入排序的函数代码3、插入排序的分析3.1 时间复杂度3.2 运行时间实例分析3.3 整体代码总结一些说明:在这里我假设的数组元素可以比较大小,且无重复元素,按照升序进行排序。1、插入排序的算法  插入排序属于只交换相邻元素的算法。  基本思想:将每次指向的数组元素在之前已排好序的元素中找到合适的位置插入,然后将其插入后的排好序的数组元素后挪。  具体实现:从第二个元素开始一直遍历到最后一个元素,每次令一个中间变量保存当前位置元素,然后开始从当前位置一直向前

2021-06-01 20:56:09 137 2

原创 Linux学习记录五——命令的使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码

2021-05-31 23:22:06 253

原创 学习随记四十三——B树(递归实现四——我的错误整体代码)

我的错误B树递归实现具体代码:花了很久的时间,最后还是没有达到我希望的功能,有点遗憾,但是在这个过程中我也学会了一些东西,首先要明白程序设计需求,再考虑设计模式,明确函数功能划分、接口设计,画出我实现的流程图,将我的实现算法能清晰表达出来再动手写伪代码,再手写具体代码自己纸上运行演算,最后再上机调试。由于我时间不是很多了,所以还有一些问题我就没有解决,留待非递归实现解决。之前各个部分的思路,具体实现都在我的同系列文章中了,就不在这里赘述。具体代码:#include<iostream>ty

2021-05-31 13:38:27 122

原创 学习随记四十二——B树(递归实现版——三、我的错误删除操作详解)

递归删除的一种“不恰当”方法详解前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsim

2021-05-31 13:20:01 163

原创 Linux学习记录四——操作文件与目录

操作文件与目录前言一、一些预备知识1、通配符2、链接硬链接软链接(符号链接)二、使用步骤1.引入库2.读入数据总结前言为什么要学习使用这些命令行程序呢?使用图形文件管理器来执行一些由这些命令执行的任务要容易的多,但是虽然使用图形文件管理器能轻松实现简单的文件操作,但是对于复杂的任务,使用命令行程序更容易完成,原因就在于命令行程序具有强大的功能和灵活的操作。一、一些预备知识1、通配符通配符是一个使命令行如此强大的shell特性,由于shell经常需要使用文件名,因此它提供了一些特殊字符来帮助你快

2021-05-23 15:57:37 214 3

原创 Linux学习记录三——常用的几个文件命令

常用的几个文件命令前言一、有关命令的一些补充信息选项和参数长列表格式二、几个常用的文件命令1、ls2、file3、less总结前言本文主要学习几个常用的文件命令,ls、file、less。一、有关命令的一些补充信息选项和参数通常,命令后面会跟有一个或多个选项,带有不同选项的命令其功能也不一样。此外,命令后面还会跟有一个或多个参数,这些参数是命令作用的对象(我感觉和调用函数有点类似),所以大部分命令看起来如下:command -options arguments大部分命令使用的选项是在单个.

2021-05-23 09:08:18 602 10

原创 Linux学习记录二——文件导航

级标题文件导航前言一、理解文件系统树二、导航命令1、pwd(显示当前工作目录)2、ls(列出目录内容)3、cd(更改当前工作目录)三、路径名绝对路径名相对路径名四、有关文件名的一些重要说明1、以“.”字符开头的文件名是隐藏的2、在Linux中文件名区分大小写3、Linux没有拓展文件名的概念4、Linux支持长文件名总结前言本篇文章主要学习目的是学习如何在Linux系统中导航文件系统,将介绍一些最基础的命令。一、理解文件系统树与Windows相同,类UNIX操作系统(如Linux)也是以称之为

2021-05-22 21:05:29 1004 2

原创 Linux学习记录一——第一次键盘输入

Linux学习记录一

2021-05-22 19:54:52 201

原创 学习随记四十——B树(递归实现版——一、B树的一些介绍)

B树前言一、B树是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、B树是什么?二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport s.

2021-05-21 10:31:19 207 1

原创 学习随记三十八——生成N个结点的随机二叉查找树并计算时间

生成N个结点的随机二叉查找树完成这个程序需要三个主要功能实现,生成N个随机结点,生成一颗二叉查找树储存这N个结点,计算程序运行时间。生成N个随机的结点:我采用的方法是生成一个数组,数组按序存储,然后生成伪随机数交换数组元素即可实现二叉查找树:因为我不想使用二级指针,所以我在设计的时候每次返回根结点地址,若根结点为空则为其开辟一个结点空间使其数据域储存待插入元素,若非空则每次使用一个结点指针记录结点地址循环定位到合适位置生成一个结点储存待插入元素,然后使新生成的结点为结点指针保存的结点的子结点即可

2021-05-12 15:57:40 267

原创 学习随记三十七——统计二叉树中不同结点类型的个数

统计二叉树中不同结点类型的个数前言:收到非递归打印一个树的函数的启发,我可以利用栈来实现较高效率的统计二叉树中不同结点的个数**函数思路:**先声明一个结点指针类型的栈,进行循环,循环条件为结点指针非空或栈非空(当结点指针与栈都为空时说明已经进行到树的最右端,完成了树的遍历),每次循环时都先将结点的左边一条儿子入栈,然后若栈非空则取栈顶指针,然后出栈,若该结点有两个子结点则满结点变量加一,反之若有一个儿子则结点变量加一,否则则为树叶统计树叶的变量加一,然后移动结点到其右儿子,遍历其右子树;当循环结束时则

2021-05-11 21:19:21 295

原创 学习随记三十六——非递归实现伸展树

非递归实现伸展树文章目录非递归实现伸展树前言一、非递归操作与递归操作有什么不一样的地方?二、程序解析总结前言完成递归实现伸展树后将递归操作转化为非递归操作完成,详细介绍可以看我的第三十五篇随记一、非递归操作与递归操作有什么不一样的地方?非递归实现伸展树与递归实现相比较而言只是将函数的递归调用返回待操作的结点地址通过循环直接定位,以及将结点路径使用栈进行记录达到自底向上进行回溯的目的,结点的旋转是一样的,其他操作也十分类似。二、程序解析1. 结点声明typedef int Eleme

2021-05-11 20:12:52 91

原创 学习随记三十五——递归实现伸展树

系列文章目录前言在我完成非递归实现AVL树后,触类旁通后面相似的树的操作我也很快就实现了。一、伸展树是什么?我的感觉伸展树是一种结合了二叉查找树与AVl树特点的树,伸展树的插入、删除与二叉树无异二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport warningswarnings.filterwa

2021-05-09 20:09:59 215

原创 学习随记三十四——非递归实现AVL树

非递归实现AVL树提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录非递归实现AVL树前言一、设计思想二、使用步骤1.引入库2.程序剖析3.遇到的问题总结前言在我完成了递归实现Avl树的操作后想用非递归实现AVl树。历时许久,发现并解决了我之前存在的很多问题,比如经常需要考虑指针的运用并防止野指针的出现,也使我体验了不参考别人,完全自己独立设计程序的过程。在这个过程中我有许多构思,我需要不断比较分析优劣并找出可能出现的问题并解决,还要考虑不同的解决方案对其他部分的影响,还要

2021-05-05 16:24:42 505

原创 学习随记三十三——递归实现AVL树

递归实现AVL树什么是AVL树: AVL树是一种自调整树,在每次插入和删除后如果平衡被破坏了就会进行自我调整达到重新平衡,AVL树是一种特殊的二叉查找树,它允许左右子树高度最多相差一,当树的平衡遭到破坏时通过单、双旋转重新达到平衡,实现AVl树的关键在于插入,每次插入后要判断树是否平衡。结点声明:typedef struct Avlnode{ ElementType data=0; struct Avlnode* Left=nullptr; struct Avlnode* Right=nullp

2021-04-21 21:58:16 174

原创 学习随记三十二——不使用递归完成二叉查找树

不使用递归完成二叉查找树相较于使用递归,不使用递归实现二叉查找树的操作稍显复杂,但是效率要高,其中最复杂的是删除操作。结点声明:typedef struct TreeNode{ElementType data=0;struct TreeNode* Left=nullptr;struct TreeNode* Right=nullptr;}TreeNode;typedef TreeNode* Bintree;使用的函数:1、插入函数:int Insert(Bintree*,ElementTy

2021-04-17 09:47:57 173

原创 学习随记三十一——递归实现二叉查找树

二叉查找树什么是二叉查找树:左子树中的元素都比父节点元素小,右子树中的元素都比父节点中的元素大二叉查找树的基本操作:1、生成一颗空树我选择使用递归来完成,如果传入的地址非空就先递归删除左子树再递归删除右子树;也可以直接生成一个空根。2、查找元素先判断传入的指针是不是空指针,如果非空再进行比较,如果待查找元素比结点元素小则在该结点的左子树中递归查找,大则在右子树中递归查找,相等则返回该结点地址。3、插入元素*4、删除结点5、打印树中元素使用中序输出,先递归输出结点左子树的元素再递归输出右子

2021-04-13 08:47:40 378

原创 学习随记三十——双端队列

双端队列基本原理:就是将双链表运用到队列上整体代码:#include<iostream>typedef struct Queue{ int data; struct Queue* next=nullptr; struct Queue* previous=nullptr;}Queue;typedef struct Linkqueue{ Queue* front=nullptr; Queue* rear=nullptr;}Linkqueue;using namespace

2021-04-06 20:32:09 76

原创 学习随记二十九——使用单链表实现队列

使用单链表实现队列使用单链表实现队列其实和尾插法实现单链表的思路没什么两样,队列和栈其实就是运算受到限制的单链表,尾插法运用在队列中,头插法运用在栈中,现在我才比较深刻的理解了头插法和尾插法的原理和应用并熟练运用。基本思路:其实就是尾插法的变形,声明一个包含两个结点指针的结点,一个指向链表头一个指向链表尾,每次插入元素在表尾,删除元素在表头整体代码#include<iostream>typedef struct Queue{ int data; struct Queue* next

2021-04-06 09:59:38 246

原创 学习随记二十八——循环队列的实现

循环队列的实现基本思路:利用模运算来判断队列的空与满,其他操作与思路与最基本的用数组实现队列一样整体代码:#include<iostream>const int quesize=10;typedef struct Queue{ int data[quesize]={0}; int front=0; int rear=0;}Queue;using namespace std;int Isempty(Queue*); //判队空int Isfull(Queu

2021-04-04 21:55:10 88

原创 学习随记二十七——使用数组实现队列

使用数组实现队列基本思路:队列和栈其实差不多,都是运算受限制的线性表,操作原理类似,一个成员记录队首,一个成员记录队尾,当队首成员等于队尾成员时即队列空,当队尾成员等于数组最大长度减一时即队列满,但这种会造成假溢出,入队元素在队尾,出队元素在队首。整体代码:#include<iostream>const int quesize=100;typedef struct Queue{ int data[quesize]={0}; int front=0; int rear=0; in

2021-04-04 15:24:00 91

原创 学习随记二十六——支持FindMin操作的栈(链栈)

支持FindMin操作的栈(链栈)基本思路:在栈顶指针结构体中包含一个min指针指向最小元素即可整体代码;#include<iostream>typedef struct Stack{ int data; struct Stack* next;}Stack;typedef struct Linkstack{ Stack* top; Stack* min;}Linkstack;using namespace std;int Isempty(Linkstack*);int

2021-04-01 10:05:52 209 1

原创 学习随记二十五——支持FindMin的栈(顺序栈)

支持FindMin的栈(顺序栈)基本思路:没什么好说的声明一个含有min记录最小值的标志变量,每次入栈时比较下就可以了整体代码:#include<iostream>const int stacksize=100;typedef struct Stack{ int data[stacksize]; int top=-1; int min=data[0];}Stack;using namespace std;int Isempty(Stack*);int Isfull(Sta

2021-04-01 09:20:37 152

原创 学习随记二十四——使用一个数组创建两个栈(方法三)

使用一个数组创建两个栈(方法三)基本思路:将数组的第一、二个单元作为两个栈的栈底,一个栈使用奇数单元,一个栈使用偶数单元,当两个栈的栈顶都触顶时就认为栈满了,说实话这种方法实现还不如直接用数组创建一个栈。整体代码:#include<iostream> //这个程序只考虑了长度为偶数的情况const int stacksize=10;typedef struct Stack{ int data[stacksize]; int top1=0; int top2=1;

2021-03-31 21:11:55 151

原创 学习随记二十三——使用一个数组建立两个栈(方法二)

使用一个数组建立两个栈(方法二)基本思路;两个栈顶从中间分别向两边扩展,当触碰到了两边的边界就认为栈满了,我觉得我使用的第一种用一个数组创建两个栈的方法比这个要好,从两边向中间扩展对资源的利用更好且更灵活。问题;我刚开始在写的时候没有充分考虑到数组越界的问题,经过后面的调试发现的,以后在使用数组时多考虑。整体代码:#include<iostream>const int stacksize=10;typedef struct Stack{ int data[stacksize];

2021-03-31 20:06:40 134

原创 学习随记二十二——用一个数组实现两个栈(方法一)

用一个数组实现两个栈(方法一)基本思路:两个栈的栈底分别在两头,栈顶向中间趋近当栈顶相遇时即说明栈满整体代码;#include<iostream>const int stacksize=10;typedef struct Stack { int data[stacksize]; int top1=-1; int top2=10;}Stack;using namespace std;int Isempty(Stack*); //判栈空int Isfull(St

2021-03-31 16:53:06 130

原创 学习随记二十一——使用链栈完成平衡符号的检测(大,中,小括号)

使用链栈完成平衡符号的检测(大,中,小括号)基本思路与使用顺序栈完成平衡符号的检测一样,不再赘述。整体代码:#include<iostream>typedef struct Stack{ char ch; struct Stack* next;}Stack;typedef struct Linkstack{ Stack* top;}Linkstack;using namespace std;int Isempty(Linkstack*); //判栈空i

2021-03-28 21:18:29 223

原创 学习随记二十——使用顺序栈完成表达式括号(大,中,小)的平衡检测

使用顺序栈完成表达式括号(大,中,小)的平衡检测为什么要使用栈完成:刚开始我想利用标志变量来完成这项工作,后面发现了使用栈完成符号平衡检测的好处,因为封闭符号(如右括号)总是与最近的开放符号匹配(如左括号),所有一旦遇到封闭符号如果栈顶元素不是与之匹配的开放符号则说明这个表达式的符号不平衡,在符号的平衡检测中充分体现了栈这种先进后出表的作用,且利用栈来完成平衡符号的检测的算法时间复杂度是O(1)。**算法:**遇到开放符号(如左括号)则入栈,遇到封闭符号(如右括号)则出栈并检查弹出的符号是否是与这个封闭

2021-03-28 20:50:20 141

原创 学习随记十九——使用链栈将中缀表达式转换成后缀表达式并计算其结果

使用链栈将中缀表达式转换成后缀表达式并计算其结果基本思路我之前的使用顺序栈将中缀表达式转换成后缀表达式与使用链栈计算后缀表达式中有详细讲解,这里不在赘述。整体代码:#include<iostream>using namespace std;typedef struct Stack1{ string stack; struct Stack1* next;}Stack1;typedef struct Linkstack1{ struct Stack1* top;}Linksta

2021-03-28 11:04:21 312

原创 学习随记十八——用链栈将中缀表达式转换成后缀表达式

用链栈将中缀表达式转换成逆波兰表达式基本思想与我的用顺序栈实现将中缀表达式转换成后缀表达式相同,只是将入栈,出栈,判栈空等操作换成链栈的操作整体代码:#include<iostream>typedef struct Stack1{ std::string stack; struct Stack1* next;}Stack1;typedef struct Linkstack1{ struct Stack1* top;}Linkstack1;using namespace st

2021-03-28 10:38:32 297

原创 学习随记十七——使用顺序栈将输入的中缀表达式变成逆波兰表达式并计算结果

使用顺序栈将输入的中缀表达式变成逆波兰表达式并计算结果主要分成两部分,一是将中缀表达式变成逆波兰表达式,二是计算逆波兰表达式,在编写过程中我使用了模板函数和函数重载。基本思路和我之前的用顺序栈计算逆波兰表达式和用顺序栈将中缀表达式转换成逆波兰表达式相同。函数代码:#include<iostream>#include<string>const int stacksize=100;using namespace std;typedef struct Stack{ doub

2021-03-27 15:59:25 96

空空如也

空空如也

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

TA关注的人

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