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
相关文章:
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顺…...
【蓝桥杯选拔赛真题52】python空调模式 第十四届青少年组蓝桥杯python 选拔赛比赛真题解析
目录 python空调模式 一、题目要求 1、编程实现 2、输入输出...
Android Studio: 解决Gradle sync failed 错误
文章目录 1. 前言2. 错误情况3. 解决办法3.1 获取gradle下载地址3.2 获取gradle存放目录3.3 替换并删除临时文件3.4 触发Try Again 4. 执行成功 1. 前言 今天调试项目,发现新装的AS,在下载gradle的过程中,一直显示连接失败,Gradl…...
【手写数据库】从零开始手写数据库内核,行列混合存储模型,学习大纲成型了
目录 专栏内容: 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点的情况下对故障容灾的支持。 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以…...
机器学习中的一些经典理论定理
PAC学习理论 当使用机器学习方法来解决某个特定问题时,通常靠经验或者多次试验来选择合适的模型、训练样本数量以及学习算法收敛的速度等。但是经验判断或多次试验往往成本比较高,也不太可靠,因此希望有一套理论能够分析问题难度、计算模型能…...
c语言:成本100元,40%的利润怎么计算|练习题
一、利润的计算公式: 利润售价-成本 售价成本/(1-利润率) 二、用c语言代码表示为: 如图: 三、计算源代码【带注释】 #include <stdio.h> int main() { float cost;//成本变量 int prof_rate;//利润率变量 float price;//…...
【Python必做100题】之第二十二题(复制列表)
题目:将一个列表的数据复制到另一个列表中 重点:确保复制到位要导入copy方法进行深度复制 代码如下: #将一个列表的数据复制到另一个列表中 import copy list [1,2,3,4] print(list) list1 copy.copy(list) list[0] 30 print(list) pri…...
Java 数据结构篇-实现堆的核心方法与堆的应用(实现 TOP-K 问题:最小 k 个数)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 堆的说明 2.0 堆的成员变量及其构造方法 3.0 实现堆的核心方法 3.1 实现堆的核心方法 - 获取堆顶元素 peek() 3.2 实现堆的核心方法 - 下潜 down(int i) 3.3 实…...
startUML6.0.1破解方法
startUML6.0.1破解方法 文章目录 startUML6.0.1破解方法1.startUML6.0.1快速破解2.概述3.安装Nodejs4.安装asar5.修改app.asar中的源码6.将修改后的源码重新压缩7.覆盖官方的asar文件8.重启startUML9.参考文档 1.startUML6.0.1快速破解 后绪步骤可以不看,直接下载我…...
Python实现多种图像分割方法:基于阈值分割和基于区域分割
Python实现多种图像分割方法:基于阈值分割和基于区域分割 图像分割是图像分析的第一步,是计算机视觉的基础,但也是图像处理中最困难的问题之一。经典的计算机视觉任务,如目标检测、图像识别等都和图像分割相关,图像分…...
SQL学习笔记+MySQL+SQLyog工具教程
文章目录 1、前言2、SQL基本语言及其操作2.1、CREATE TABLE – 创建表2.2、DROP TABLE – 删除表2.3、INSERT – 插入数据2.4、SELECT – 查询数据2.5、SELECTDISTINCT – 去除重复值后查询数据2.6、SELECTWHERE – 条件过滤2.7、AND & OR – 运算符2.8、ORDER BY – 排序2…...
SpringBoot的日志管理
🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈,…...
leetcode---76. 最小覆盖子串 [C++/滑动窗口+哈希表]
原题:76. 最小覆盖子串 - 力扣(LeetCode) 题目解析: 此题在这道题的基础上进行理解会更简单 leetcode --- 30. 串联所有单词的子串[C 滑动窗口/双指针]-CSDN博客 本题要求在s字符串中找到含有t字符串所有字符的最短子串。 也就是…...
Kafka 分级存储在腾讯云的实践与演进
导语 腾讯云消息队列 Kafka 内核负责人鲁仕林为大家带来了《Kafka 分级存储在腾讯云的实践与演进》的精彩分享,从 Kafka 架构遇到的问题与挑战、Kafka 弹性架构方案类比、Kafka 分级存储架构及原理以及腾讯云的落地与实践四个方面详细分享了 Kafka 分级存储在腾讯云…...
域架构下的功能安全思考
来源:联合电子 随着整车电子电气架构的发展,功能域控架构向整车集中式区域控制演进。新的区域控制架构下,车身控制模块(BCM),整车控制单元(VCU),热管理系统(TMS)和动力底…...
python多线程介绍
每个库或模块都有其特定的用途和优势,选择哪一个取决于具体的任务需求、计算资源。一般可以将任务分成两类: I/O 密集型任务:这些任务的瓶颈主要在于等待外部操作,如磁盘读写或网络通信。在这些等待期间,CPU 大部分时间…...
征文榜单 | 腾讯云向量数据库获奖名单公布
为了帮助开发者更快、更便捷地构建应用程序,有效提高开发人员生产力,腾讯云推出了AI原生向量数据库。它能提供全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据,是国内首个从接入层、计算层、到存储层提供…...
如何预防[[MyFile@waifu.club]].wis [[backup@waifu.club]].wis勒索病毒感染您的计算机?
导言: 近期,一种新兴的威胁[[MyFilewaifu.club]].wis [[backupwaifu.club]].wis勒索病毒,引起了广泛关注。这种恶意软件通过其高度复杂的加密算法,威胁着用户和组织的数据安全。本文将深入介绍[[MyFilewaifu.club]].wis [[backup…...
中国风春节倒计时【实时倒计时】
<head><meta charset="UTF-8"><meta name="apple-mobile-web-app-title...
基于RBAC的k8s集群权限管控案例
在日常的kubernetes集群维护过程中,常常涉及多团队协作,不同的团队有不同的操作和权限需求。比如,运维团队需要有node的所有操作权限,以便对集群进行节点的扩缩容等日常维护工作,但资产运营团队通常只需要node的查看权…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
