JavaSE学习笔记 Day20

JavaSE学习笔记 Day20

个人整理非商业用途,欢迎探讨与指正!!
« 上一篇


文章目录

  • JavaSE学习笔记 Day20
    • ···
    • 十七、数据结构与算法
      • 17.1算法
        • 17.1.1冒泡排序
        • 17.1.2选择排序
        • 17.1.3插入排序
        • 17.1.4三个排序的区别
      • 17.2顺序表
        • 17.2.1顺序表代码实现
        • 17.2.2顺序表的问题
        • 17.2.3顺序表的扩容问题解决
      • 17.3链表
        • 17.3.1链表的代码实现
      • 17.4树
        • 17.4.1树的相关名称
        • 17.4.2树的分类
        • 17.4.3二叉树


···

十七、数据结构与算法

排序算法,线型结构,树型结构,图…

17.1算法

在计算机中实现数学公式或者数学逻辑

17.1.1冒泡排序

相邻的两个数进行比较,大的向后,反复这样的操作

public class Demo01 {//	编写冒泡排序算法的方法public static int[] range(int ...args) {for(int i = 0;i<args.length - 1;i++) {for(int j = 0;j<args.length - 1 - i;j++) {
//				两个数进行比较,大的数值向后if(args[j] > args[j + 1]) {int temp = args[j];args[j] = args[j+1];args[j+1] = temp;}}}return args;}public static void main(String[] args) {int[] range = range(10,20,31,14,200,30);for (int i : range) {System.out.println(i);}}
}
17.1.2选择排序

算法描述
 在未排序的序列中找到一个最大(小),存放到需要排序的序列最开始的位置
 然后再从剩余的未排序的元素中继续寻找最大(小),然后排放到已排序的末尾
 以此类推,直到所有元素都排序完毕

//	1.从未排序的数组中找到最小值
public class Test01 {public static void main(String[] args) {
//		定义未排序的数组int[] arr = {1,4,123,5,3,1235,5,2,4};
//		遍历数组找到最小的元素
//		假定最小的元素为 第0个位置int minValue = arr[0];//		通过循环判断出真实的最小值for(int i = 0;i<arr.length;i++) {
//			所有位置都和最小值去比较if(arr[i] < minValue) {
//				更新最小值minValue = arr[i];}}		System.out.println("最小值为:"+minValue);}
}
//	2.将最小值和没有排序的数组的一个元素进行交换
public class Test02 {public static void main(String[] args) {
//		定义未排序的数组int[] arr = {4,123,5,3,1235,5,2,4,1};
//		遍历数组找到最小的元素//		定义一个下标,获取到最小的下标int minPosition = 0;//		通过循环判断出真实的最小值for(int i = 0;i<arr.length;i++) {
//			所有位置都和最小值去比较if(arr[i] < arr[minPosition]) {
//				获取最小值的下标minPosition = i;}}System.out.println("最小值为:"+arr[minPosition]);System.out.println("最小值的下标:"+minPosition);//		将最小值更换到0的位置int temp = arr[0];arr[0] = arr[minPosition];arr[minPosition] = temp;System.out.println(Arrays.toString(arr));}
}
//	3.将未排序的数组,重复的进行1和2步
public class Test03 {public static void main(String[] args) {int[] arr = {4,123,5,3,1235,5,2,4,1};
//		定义循环变量int start = 0;int minPosition = start;for(int i = start;i<arr.length;i++) {if(arr[i] < arr[minPosition]) {minPosition = i;}}System.out.println("最小值为:"+arr[minPosition]);System.out.println("最小值的下标:"+minPosition);int temp = arr[start];arr[start] = arr[minPosition];arr[minPosition] = temp;System.out.println(Arrays.toString(arr));//		重复的执行start = 1 start = 2 ... 时的变化}
}
//	4.使用循环去完成整个算法的优化
//	将未排序的数组,重复的进行1和2步
public class Test04 {public static int[] range(int ...arr) {//start不是随意的,start表示的是下标for(int start = 0;start < arr.length;start ++) {int minPosition = start;for(int i = start;i<arr.length;i++) {if(arr[i] < arr[minPosition]) {minPosition = i;}}int temp = arr[start];arr[start] = arr[minPosition];arr[minPosition] = temp;}return arr;}public static void main(String[] args) {int[] arr = {4,123,5,3,1235,5,2,4,1};arr = range(arr);System.out.println(Arrays.toString(arr));}
}
17.1.3插入排序

算法描述:
 1.从第一个元素开始,该元素被认定为已经排序
 2.取出下一个数,在已经排序的元素序列从后向前扫描
 3.若该元素(已排序的)大于新元素,该元素向下移位
 4.重复第3步,直到找到已排序的元素小于或者等于新的元素位置
 5.将新的元素插入到该位置
 6.重复2-5

public class Test02 {//	1.从没有排序的数组中取出一个元素,和已排序的数组中的内容进行比较,小的向前public static void main(String[] args) {int[] arr = {8,6,4,7,44,3,21};
//		认为arr[0]是有序的
//		取出一个值int insert = arr[1];
//		判断大小if(arr[0] > insert) {
//			若大则向后arr[1] = arr[0];}//		安排取出来的值arr[0] = insert;System.out.println(Arrays.toString(arr));//		0 1有序
//		取一个值insert = arr[2];if(arr[1] > insert) {
//			大的值向后arr[2] = arr[1];}if(arr[0] > insert) {
//			大的值向后arr[1] = arr[0];}
//		安排取出去的值arr[0] = insert;System.out.println(Arrays.toString(arr));insert = arr[3];if(arr[2] > insert) {
//			大的向后arr[3] = arr[2];}if(arr[1] > insert) {
//			大的向后arr[2] = arr[1];}else {
//			若不大,则插入到指定的位置arr[2] = insert;}System.out.println(Arrays.toString(arr));insert = arr[4];if(arr[3] > insert) {arr[4] = arr[3];}if(arr[2] > insert) {arr[3] = arr[2];}System.out.println(Arrays.toString(arr));insert = arr[5];if(arr[4] > insert) {arr[5] = arr[4];}if(arr[3] > insert) {arr[4] = arr[3];}if(arr[2] > insert) {arr[3] = arr[2];}if(arr[1] > insert) {arr[2] = arr[1];}if(arr[0] > insert) {arr[1] = arr[0];}arr[0] = insert;System.out.println(Arrays.toString(arr));insert = arr[6];if(arr[5] > insert) {arr[6] = arr[5];}if(arr[4] > insert) {
//			大的向后arr[5] = arr[4];}else {
//			不大说明到地方了arr[5] = insert;}System.out.println(Arrays.toString(arr));}
}
public class Test04 {public static int[] range(int ...arr) {for(int index = 1;index<arr.length;index++) {int insert = arr[index];while(index > 0) {if(arr[index-1] > insert) {arr[index] = arr[index - 1];}else {arr[index] = insert;break;}index --;if(index == 0) {arr[0] = insert;}}}return arr;}public static void main(String[] args) {int[] arr = {8,6,4,7,44,3,21,-1};arr = range(arr);System.out.println(Arrays.toString(arr));}
}
17.1.4三个排序的区别

冒选插都使用了循环,并且基本上都是遍历所有的元素,时间复杂度都是O(N^2)
有一些细微的差别
 冒泡,书写最简单的,但是性能没有另外两个好,比较次数和轮数是最多的
 选择,比较次数比较多,但是交换次数少
 插入,交换的次数多,但是比较次数会相对少一些

17.2顺序表

内存中以数组的形式,保存的一种数据结构,使用一连串的内存地址线性的存储数据的

17.2.1顺序表代码实现
public class MyArrayList<T> {//	存储的元素private T[] items;
//	存储数据的有效数值private int size;
//	添加构造方法public MyArrayList(int capacity) {
//		capacity容量}
//	获取当前集合的元素个数public int size() {return size;}//	添加到数组 添加到数组的尾部public void add(T t) {
//		设计扩容方法}
//	返回指定下标的元素public T get(int i) {return items[i];}
//	移除public T remove(int i) {
//		下标是否合法
//		将后面的内容向前移动
//		将最后一个位置设置为nullreturn items[i];}
}
17.2.2顺序表的问题

扩容问题,数组的长度的是固定的,没有空间时就会抛出数组下标越界异常
 ArrayIndexOutOfBoundsException

17.2.3顺序表的扩容问题解决

1.自定义扩容算法
2.System的arrayCopy(原数组,原数组拷贝的下标,新数组,新数组拷贝的下标,拷贝的长度)
3.Arrays的copyOf(原数组,新数组的长度)底层调用的是System的arrayCopy

17.3链表

顺序表,内存连续,查询快,删除修改慢
链表是概念上逻辑上的连续,内存中并不连续,物理地址中存放是不连续的,无顺序的
插入和删除修改性能特别高
查询效率低

17.3.1链表的代码实现

链表不是使用数组实现的,而是通过节点实现的

//	单链表
public class Node<T> {T item;//存储当前节点元素Node next;//下一元素public Node(T item,Node next){this.item = item;this.next = next;}
}
//	双链表
public class Node2<T> {Node2<T> pre;//上一个T item;//当前的Node2<T> next;//下一个public Node2(Node2<T> pre,T item,Node2<T> next) {this.pre = pre;this.item = item;this.next = next;}public static void main(String[] args) {
//		就是双链表中的唯一数据Node2<String> n1 = new Node2<String>(null, "helloworld", null);Node2<String> n2 = new Node2<String>(n1, "嘿嘿", null);Node2<String> n3 = new Node2<String>(n2, "嘎嘎", null);}
}

17.4树

树这种数据结构可以同时提高存储和检索的效率
数的特征:
 1.数由n个有限节点组成一个有层次关系的集合
 2.每个节点都有0个或多个子节点
 3.没有父节点的成为根节点
 4.每个非根节点,只有一个父节点
 5.除了根节点以外,每个子节点都可以分为多个不相交的子树

17.4.1树的相关名称

节点:树中存储数据的对象
根节点:树中唯一没有父节点的节点
父节点:节点的上一层节点,每个节点最多只有一个父节点
子节点:节点的下一层节点,每个节点可以有多个子节点或者没有
叶子节点:没有子节点的节点
节点的度:节点的子节点数量
树的度:一颗树中,最大节点的度称为树的度
路径:从根节点到当前节点的路径
节点的层:从根节点开始,根节点为1层,下一层为2层,以此类推
高度:数的最大层
森林:有n棵不相交的树的组成的集合称为森林,若一棵树根节点删除,那么会变成一个森林

17.4.2树的分类

二叉树:
 每个父节点只有两个子节点
 查找数:
  平衡树和红黑树
 带权树:
   最优二叉数
多叉数:
 每个父节点超过两个子节点
 B_树,B+树

17.4.3二叉树

二叉树的度:2
 满二叉树:每个节点都是饱和状态
 完全二叉树:最后一层的节点数,从左向右是连续的(满二叉树是完全二叉树的天特殊情况)
树的遍历
 将所有的节点都访问一次,只有一次
 前序遍历:根左右
 中序遍历:左根右
 后序遍历:左右根

前序/先序:1 245 367
中序:425 1 637
后序:452 673 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/233602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蜘点云原生之 KubeSphere 落地实践过程

作者&#xff1a;池晓东&#xff0c;蜘点商业网络服务有限公司技术总监&#xff0c;从事软件开发设计 10 多年&#xff0c;喜欢研究各类新技术&#xff0c;分享技术。 来源&#xff1a;本文由 11 月 25 日广州站 meetup 中讲师池晓东整理&#xff0c;整理于该活动中池老师所分享…

npm login报错:Public registration is not allowed

npm login报错:Public registration is not allowed 1.出现场景2.解决 1.出现场景 npm login登录时,出现 2.解决 将自己的npm镜像源改为npm的https://registry.npmjs.org/这个&#xff0c;解决&#xff01;

Android Studio 显示前进后退按钮

在写代码的过程中我们经常需要快速定位到先前或者往后的代码位置&#xff0c;可以使用Alt左右箭头 但是新安装的Android Studio工具栏上是没有显示左右箭头的工具按钮的&#xff0c;需要我们设置将Toolbar显示出来 View-Appearance-Toolbar 勾选即可 显示后

关于反射机制的简单理解

1、反射的简单认识 1.1 定义 Java的反射&#xff08;reflection&#xff09;机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff0c;既然能拿到,那么我…

el-form与el-upload结合上传带附件的表单数据(后端篇)

1.写在之前 本文采用Spring Boot MinIO MySQLMybatis Plus技术栈&#xff0c;参考ruoyi-vue-pro项目。 前端实现请看本篇文章el-form与el-upload结合上传带附件的表单数据&#xff08;前端篇&#xff09;-CSDN博客。 2.需求描述 在OA办公系统中&#xff0c;流程表单申请人…

【图的应用一:最小生成树】- 用 C 语言实现普里姆算法和克鲁斯卡尔算法

目录 一、最小生成树 二、普里姆算法的构造过程 三、普里姆算法的实现 四、克鲁斯卡尔算法的构造过程 五、克鲁斯卡尔算法的实现 一、最小生成树 假设要在 n 个城市之间建立通信联络网&#xff0c;则连通 n 个城市只需要 n - 1 条线路。这时&#xff0c;自然会考虑这样…

Android的组件、布局学习

介绍 公司组织架构调整&#xff0c;项目组需要承接其他项目组的android项目&#xff0c;负责维护和开发新需求&#xff0c;故学习下基础语法和项目开发。 组件学习 Toolbarheader布局部分 就是app最顶部的部分 他的显示与否&#xff0c;是与F:\androidProject\android_lear…

功能点估算的常规流程

功能点估算流程在软件项目管理中起着重要的作用&#xff0c;它可以帮助项目团队更好地理解项目的需求和目标&#xff0c;从而提高项目的成功率和效率。如果功能点估算未按流程进行&#xff0c;可能会导致项目估算不准确&#xff0c;估算时间超出预期等问题。 因此功能点估算的常…

设计测试用例(万能思路 + 六种设计用例方法)(详细 + 图解 + 实例)

一、设计测试用例的万能思路 针对某个物品/功能进行测试。 万能思路&#xff1a;功能测设 界面测试 性能测试 兼容性测试 易用性测试 安全测试。 总结&#xff1a; 功能测试&#xff1a; 水杯&#xff1a;装水、喝水... 注册场景&#xff1a;注册 登录 想象日常使用…

西南科技大学数字电子技术实验五(用计数器设计简单秒表)FPGA部分

一、实验目的 1.进一步理解用中规模集成计数器构成任意进制计数器的原理。 2.了解计数器的简单应用。 3.进一步学习与非门和译码显示器的使用方法。 4.学会用FPGA实现本实验内容。 二、实验原理 简单秒表 可暂停、复位秒表 三、程序清单(每条语句必须包括注释或在开发…

[Linux] LVS+Keepalived高可用集群部署

一、Keepalived实现原理 1.1 高可用方案 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题。 在一个LVS服务集群中通常有主服务器&#xff08;MASTER&#xff09;和备份服务器&#xff08;BACKUP&#xff09;两种角色…

Jenkins+Docker+Gitee搭建自动化部署平台

目录 服务器准备 Docker安装 yum 包更新到最新 设置yum源 安装docker 启动和开机启动 验证安装是否成功 Jenkins安装 拉取镜像 创建映射目录 运行镜像 运行出错 修正权限 重新运行镜像 新建安全组&#xff0c;放通8080端口 激活Jenkins Jenkins插件 Jenkins全…

【论文解读】Comparing VVC, HEVC and AV1 using Objective and Subjective Assessments

时间&#xff1a;2020 级别&#xff1a;IEEE 机构&#xff1a; IEEE 组织 摘要&#xff1a; 对3种最新的视频编码标准HEVC (High Efficiency video Coding)测试模型HM (High Efficiency video Coding)、amedia video 1 (AV1)和Versatile video Coding测试模型 (VTM)进行了客观和…

UE5 水材质注意要点

1、两个法线反向交替流动&#xff0c;可以去观感假的现象 2、水面延边的透明度低 3、增加水面延边的浪花 4、增加折射 折射要整体质量至少在High才有效果 改为半透明材质没有法线信息&#xff1f; 5、处理反射效果 勾选为true 找到这个放在水域 勾为false&#xff0c;即可有非…

欺骗技术:网络反情报的艺术

网络攻击变得越来越普遍和复杂。例如&#xff0c;2022 年&#xff0c;数据泄露的平均成本高达 445 万美元&#xff0c;显示了这些威胁的严重影响。 这清楚地表明对先进安全方法的需求与日俱增。迅速流行的技术之一是欺骗技术。 与直接阻止或识别威胁的标准安全方法不同&…

VBA之Word应用:利用代码统计文档中的书签个数

《VBA之Word应用》&#xff08;版权10178982&#xff09;&#xff0c;是我推出第八套教程&#xff0c;教程是专门讲解VBA在Word中的应用&#xff0c;围绕“面向对象编程”讲解&#xff0c;首先让大家认识Word中VBA的对象&#xff0c;以及对象的属性、方法&#xff0c;然后通过实…

在 Kubernetes 上部署 Python 3.7、Chrome 和 Chromedriver(版本 114.0.5735.90)的完整指南

一、构建基础镜像 docker build -f /u01/isi/DockerFile . -t thinking_code.com/xhh/crawler_base_image:v1.0.2docker push thinking_code.com/xhh/crawler_base_image:v1.0.2 二、K8s运行Pod 三、DockerFile文件 # 基于镜像基础 FROM python:3.7# 设置代码文件夹工作目录…

Axure中继器的使用实现表格的增删改查的自定义文件

目录 一.认识中继器 1.1.什么中继器 1.2. 中继器的组成 1.3.中继器的使用场景 二.中继器进行增删改查 三.十例表格增删改查 还有Axure这个东西许多东西需要我们去发现&#xff0c;我们需要去细心的研究&#xff0c;我们一起加油吧&#xff01;&#xff01;&#xff01;今…

ASP.NET Core MVC依赖注入理解(极简个人版)

依赖注入 文献来源&#xff1a;《Pro ASP.NET Core MVC》 Adam Freeman 第18章 依赖注入 1 依赖注入原理 所有可能变化的地方都用接口在使用接口的地方用什么实体类通过在ConfigureService中注册解决注册的实体类需要指定在何种生命周期中有效 TransientScopedSingleton 2…

SQL 入门指南:从零开始学习 SQL

当今时代&#xff0c;数据已经成为了我们生活中不可或缺的一部分。无论是企业的经营决策&#xff0c;还是个人的日常消费习惯&#xff0c;都需要通过对数据的收集、分析和应用来实现更好的结果。 而关系型数据库系统&#xff0c;作为最常见的数据存储和管理方式&#xff0c;SQ…