JavaSE学习笔记 Day20

news2024/12/24 0:22:01

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) {
//		下标是否合法
//		将后面的内容向前移动
//		将最后一个位置设置为null
		return 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.coloradmin.cn/o/1322581.html

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

相关文章

Python+pip下载与安装

Hi, I’m Shendi Pythonpip下载与安装 最近有识别图片中物体的需求&#xff0c;于是选用了TensorFlow&#xff0c;在一番考虑下&#xff0c;还是选择直接使用Python。 Python下载安装 直接在搜索引擎搜索Python或通过 https://www.python.org 进入官网 在 Downloads 处点击 Al…

腾讯云debian服务器的连接与初始化

目录 1. 远程连接2. 软件下载3. 设置开机自启动 1. 远程连接 腾讯云给的服务器在安装好系统之后&#xff0c;只需要在防火墙里面添加一个白名单&#xff08;ip 或者域名&#xff09;就能访问了。 防火墙添加本机WLAN的IPv4白名单&#xff0c;本地用一个远程工具连接&#xff…

JAVA:深入探讨Java 8 Stream的强大功能与用法

1、简述 Java 8引入了Stream API&#xff0c;为处理集合数据提供了一种更为强大和灵活的方式。Stream是一种抽象的数据结构&#xff0c;它允许你以一种声明性的方式处理数据集合。与传统的集合操作不同&#xff0c;Stream并不是一个存储数据的数据结构&#xff0c;而是在源数据…

到底该如何优化代码?怎样会使得代码更加糟糕?

文章目录 前言开始语法规范有函数式方法的尽量用判断字符串为空不要自己写equals判定,常量写前面少用魔法值,定义常量无状态方法,可选择定义为类静态 逻辑简化明确主体逻辑语法简化:三元运算符语法简化:Optional方法独立存在的必要性讨论 继续拓展:定义枚举值枚举构建关系枚举构…

【 AI 两步实现文本 转 语音】

基于hugging face 中 XTTS-v2 模型做文本转语音&#xff0c;此模型支持17种语言 1.登录hugging face 官网 https://huggingface.curated.co/ 或者 https://hf-mirror.com/models 找到models处下载XTTS-V2 如果你全程可以联网&#xff08;/huggingface.co&#xff09;直接步骤…

福德植保无人机:让植保工作更轻松

亲爱的读者们&#xff0c;欢迎来到我们的公众号&#xff01;今天&#xff0c;我想和大家分享一个我们生活中不可或缺的东西——福德植保无人机。它不仅改变了我们的植保工作&#xff0c;更提升了工作效率&#xff0c;减少了人工负担。福德植保无人机&#xff0c;一家在植保无人…

MS5602数模转换器可Pin to Pin兼容TLC5602

MS5602是低功率、超高速视频数模转换器。可Pin to Pin兼容TLC5602。MS5602以从DC至20MHz的采样速率将数字信号转换成模拟信号。由于高速工作&#xff0c;MS5602适合于数字电视、电脑视频处理及雷达信号处理等数字视频应用。 MS5602 工作于-40℃至 85℃。 主要特点 8 位分辨率…

面试算法56:二叉搜索树中两个节点的值之和

题目 给定一棵二叉搜索树和一个值k&#xff0c;请判断该二叉搜索树中是否存在值之和等于k的两个节点。假设二叉搜索树中节点的值均唯一。例如&#xff0c;在如图8.12所示的二叉搜索树中&#xff0c;存在值之和等于12的两个节点&#xff08;节点5和节点7&#xff09;&#xff0…

输出26个英文字母 C语言xdoj97

描述&#xff1a; 编写一个程序&#xff0c;分别按正向和逆向输出小写字母。 输入说明&#xff1a; 无。 输出说明&#xff1a; 字母间以空格分隔&#xff0c;正向输出完换行&#xff0c;再逆向输出。 输入样例 无。 输出样例 无。 #include <stdio.h>//输出26个英文字…

【迁移学习论文四】Multi-Adversarial Domain Adaptation论文原理及复现工作

Multi-Adversarial Domain Adaptation 多对抗域适应 前言 好久没有更新了&#xff0c;所以这周开始记录下来&#xff0c;也好督促自己。记录本人预备研究生阶段相关迁移学习论文的原理阐述以及复现工作。 问题 跨域混淆或错误对齐 文章介绍 这篇文章于2018年发表在AAAI&…

评价机器学习模型的指标

为了衡量一个机器学习模型的好坏&#xff0c;需要给定一个测试集&#xff0c;用模型对测试集中的每一个样本进行预测&#xff0c;并根据预测结果计算评价分数。 对于分类问题&#xff0c;常见的评价标准有准确率、精确率、召回率和F值等。给定测试集 &#x1d4af; {(&#x1…

系统设计——系统安全

HTTPS 是如何工作的&#xff1f; 安全超文本传输​​协议&#xff08;HTTPS&#xff09;是超文本传输​​协议&#xff08;HTTP&#xff09;的扩展。HTTPS 使用传输层安全性&#xff08;TLS&#xff09;传输加密数据。如果数据在网上被劫持&#xff0c;劫持者得到的只是二进制…

selenium-wire简介

一.简介 以下来自chatGPT回答&#xff1a; selenium-wire是一个基于selenium的Python库&#xff0c;它扩展了selenium的功能&#xff0c;使得我们可以在自动化测试中直接访问和修改浏览器的网络请求和响应。selenium-wire可以拦截和修改HTTP请求和响应&#xff0c;从而可以在…

【一周安全资讯1216】欧盟就AI监管《人工智能法案》达成历史性协议;赛迪发布《中国网络安全测评服务市场研究报告 (2023)》

要闻速览 1、欧盟就全球首个AI监管《人工智能法案》达成历史性协议 2、我国牵头提出的国际标准《信息技术 网络安全 第7部分&#xff1a;网络虚拟化安全指南》正式发布 3、《粤港澳大湾区&#xff08;内地、香港&#xff09;个人信息跨境流动标准合同实施指引》发布 4、赛迪顾…

三相异步电机动态数学模型推导及矢量控制仿真

文章目录 **原文链接&#xff0c;点击跳转**三相异步电机动态数学模型及矢量控制仿真1、异步电机三相方程2、坐标变换3、磁链3/2变换推导4、两相静止坐标系下的方程5、两相旋转坐标系下的方程6、以 ω-is-Ψr 为状态变量的状态方程7、矢量控制及 matlab 仿真 原文链接&#xff…

【C语言】数据结构——链式二叉树实例探究

&#x1f497;个人主页&#x1f497; ⭐个人专栏——数据结构学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 导读&#xff1a; 我们在前面学习了单链表&#xff0c;顺序表&#xff0c;栈和队列&#xff0c;小堆。 今天我们来学习链式二叉…

WPF仿网易云搭建笔记(7):HandyControl重构

文章目录 专栏和Gitee仓库前言相关文章 新建项目项目环境项目结构 代码结果结尾 专栏和Gitee仓库 WPF仿网易云 Gitee仓库 WPF仿网易云 CSDN博客专栏 前言 最近我发现Material Design UI的功能比较简单&#xff0c;想实现一些比较简单的功能&#xff0c;比如消息提示&#xff0…

抖音直播间websocket礼物和弹幕消息推送可能出现重复的情况,解决办法

在抖音直播间里&#xff0c;通过websocket收到的礼物消息数据格式如下&#xff1a; {common: {method: WebcastGiftMessage,msgId: 7283420150152942632,roomId: 7283413007005207308,createTime: 1695803662805,isShowMsg: True,describe: 莎***:送给主播 1个入团卡,priority…

解决goview栈内存溢出导致打包报错问题

最近搞低代码大屏使用goview打包时遇到问题 报错&#xff1a; vite v4.3.6 building for production... transforming (8931) node_modules\monaco-editor\esm\vs\base\common\navigator.js <--- Last few GCs ---> [24864:000001B515BA39F0] 65979 ms: Scavenge 2002.0…

VueStu01-Vue是什么

1.概念 Vue 是一个 用于构建用户界面 的 渐进式 框架 。 2.构建用户界面 基于数据渲染出用户看到的页面。 3.渐进式 Vue的学习是循序渐进的&#xff0c;可以学一点用一点&#xff0c;不必全部学完才能用。哪怕你只学了 声明式渲染 这一个小部分的内容&#xff0c;你也可以完成…