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的查看权…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...
2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】
1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...
