几种常见的算法
一、冒泡排序法
冒泡排序法
原始数据:3 2 7 6 8
第1次循环:(最大的跑到最右边)
2 3 7 6 8(3和2比较,2<3 所以2和3交换位置)
2 3 7 6 8(3和7比较,3<7 所以不需要交换位置)
2 3 6 7 8(6和7比较,6<7 所以6和7交换位置)
2 3 6 7 8(7和8比较,7<8 所以不需要交换位置)
经过第1次循环,此时剩下参与比较的数据:2 3 6 7
第2次循环:
2 3 6 7(2和3比较,2<3,所以不需要交换位置)
2 3 6 7(3和6比较,3<6,所以不需要交换位置)
2 3 6 7 (6和7比较,6<7,所以不需要交换位置)
经过第2次循环,此时剩下参与比较的数据是:2 3 6
第3次循环:
2 3 6(2和3比较,2<3,所以不需要交换位置)
2 3 6(3和6比较,3<6,所以不需要交换位置)
经过第3次循环,此时剩下参与比较的数据是:2 3
第4次循环
2 3(2和3比较,2<3,所以不需要交换位置)
public class BubbleSort{
public static void main(String[] args){
//这是int类型的数组对象
int[] arr = {3,2,6,7,8};
//经过冒泡排序算法对以上数组中元素进行排序
//冒泡排序算法的核心是什么?
//7条数据,循环6次。以下的代码可以循环6次(冒泡排序法采用外层循环)
int count = 0;
for(int i=arr.length-1;i>0;i--){
//不管是否需要交换,总之是要比较一次的
count++;
//9 8 10 7 6 0 11
for(int j=0;j<i;j++){
if(arr[i]>arr[j+1]){
//交换位置
//arr[j]和arr[j+1]交换
int temp;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println("比较次数:”+count);
//输出结果
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
二、选择排序法
选择排序法比冒泡排序法的效率高
高在交换位置上
选择排序的交换位置是有意义的
每一次从这“堆”参与比较的数据当中“找出最小值”
拿这个最小值和“参与比较的这堆最前面的元素”交换位置
循环一次,然后找出参加比较的这堆数据中最小的。拿这个最小的值和
最前面的数据交换位置。
参与比较的数据:3 1 6 2 5
第1次循环之后的结果是: 1 3 6 2 5
下次参与比较的数据:3 6 2 5
第2次循环之后的结果是:2 6 3 5
下次参与比较的数据是:6 3 5
第3次循环之后的结果是:3 6 5
下次参与比较的数据是: 6 5
第4次循环之后的结果是: 5 6
注意:5条数据,循环4次
冒泡排序和选择排序实际上比较的次数没变
交换位置的次数减少了
3 2 6 1 5
假设:
第1个3是最小的
3和2比较,发现2更小,所以此时最小的是2
继续拿着2往下比对,2和6比较,2仍然是最小的
继续拿着2往下比对,2和1比对,发现1更小,所以此时最小的是1
继续拿着1往下比对,1和5比对,发现1还是小的,所以1就是最小的
拿着1和最左边的3交换位置
2 6 3 5
假设:
第1个2是最小的
……
6 3 5
假设6是最小的,6和3比对,发现3更小,所以此时最小的是3
……
public class SelectSort{
public static void main(String[] args){
int[] arr = {3,1,6,2,5};
int count = 0;
//选择排序
//5个数据循环4次(外层循环4次)
for(int i=0;i<arr.length-1;i++){
//i的值是0 1 2 3
//i正好是“参加比较的这堆数据中”最左边那个元素的下标
//i是一个参与比较的这堆数据中的起点下标
//假设起点i下标位置上的元素是最小的
int min = I;
for(int j=i+1;j<arr.length;j++){
count++;
if(arr[j]<arr[min]){
min = j; //最小值的元素下标是j
}
}
//当i和min相等时,表示最初猜测是对的
//当i和min不相等时,表示最初猜测是错的,有比这个元素更小的元素
//需要拿着这个更小的元素和最左边的元素交换位置
if(min!=i){
//表示存在更小的数据
//arr[min]最小的数据
//arr[i]最前面的数据
int temp;
temp = arr[min];
arr[min = arr[i];
arr[i] = temp;
}
}
System.out.println("比较次数"+count);
//排序之后遍历
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
三、二分法查找
数组的元素查找
数组元素查找两种方式:
第一种方式:一个一个挨着找,直到找到为止
第二种方式:二分法查找(算法),这个效率较高
public class ArraySearch{
public static void main(String[] args){
//这个例子演示第一种方式
int[] arr = {4,5,6,87,8};
//需求:找出87的下标。一个一个挨着找
for(int i=0;i<arr.length;i++){
if(arr[i]==87){
System.out.println("87元素的下标是:"+i);
return;
}
}
//程序执行到此处,表示没有87
System.out.println("87不存在该元素!");
//最好以上的程序封装到一个方法,思考:传什么参数?返回什么值?
//传什么:第一个参数是数组,第二个参数是被查找的元素
//返回值:返回被查找的这个元素的下标,如果找不到返回-1
int index = arraySearch(arr,87);
System.out.println(index == -1?"该元素不存在1":"该元素下标是:"+index):
}
//从数组中检索某个元素的下标(返回的是第一个元素的下标)
//arr 被检索的数组
//ele 被检索的元素
//大于等于0的数表示元素的下标,-1表示该元素不存在
public static void arraySearch(int[] arr,int ele){
for(int i=0;i<arr.length;i++){
if(ele == arr[i]){
return I;
}
}
return -1;
}
}
关于查找算法中的:二分法查找
10(下标0)11 12 13 14 15 16 17 18 19 20(下标10) arr数组
通过二分法查找,找出18这个元素的下标:
(0+10)/2-->中间元素的下标:5
拿着中间这个元素和目标要查找的元素进行对比:
中间元素是:arr[5]-->15
15<18(被查找的元素)
被查找的元素18在目前中间元素15的右边
再重新计算一个中间元素的下标:
开始下标是:5+1
结束下标是:10
(6+10)/2-->8
8下标对应的元素arr[8]是18
找到的中间元素正好和被查找的元素18相等,表示找到了:下标为8
二分法查找的终止条件:一直折半,直到中间的那个元素恰好是被查找的元素
二分法查找算法是基于排序的基础之上。(没有排序的数据是无法查找的)
publc class ArrayUtil{
public static void main(String[] args){
int[] arr = {100,200,230,235,600,1000,2000,9999);
//找出arr这个数据中200所在的下标
//调用方法
int index = binarySearch(arr,200);
System.out.println(index==-1?"该元素不存在!":"该元素下标”+index);
}
// dest 目标元素
//-1表示该元素不存在,其他表示返回该元素的下标
public static void binarySearch(int[] arr,int dest){
//开始下标
int begin = 0;
//结束下标
int end = arr.length-1;
//开始元素的下标只要在结束元素下标的左边,就有机会继续循环
while(begin<=end){
//中间元素下标
int mid = (begin+end)/2;
if(arr[mid]==dest){
return mid;
}else if(arr[mid]<dest){
//目标在“中间”的右边
//开始元素下标需要发生变化(开始元素的下标需要重新赋值)
begin = mid +1; //一直加
}else{
//arr[mid]>dest
//目标在“中间”的左边
//修改结束元素的下标
end = mid -1; //一直减
}
}
return -1;
}
二分法查找原理
10(下标是0) 23 56 89 100 111 222 235 500 600(下标9)arr数组
目标:找出600的下标
(0+9)/2-->4(中间元素的下标)
arr[4]这个元素就是中间元素:arr[4]是100
100<600
说明被查找的元素在100的右边
那么此时开始下标变成:4+1
(5+9)/2-->7(中间元素的下标)
arr[7]对应的值是:235
235<600
说明被查找的元素在235的右边
开始下标有进行了转变:7+1
(8+9)/2-->8
arr[8]-->500
500<600
开始元素的下标又发生了变化:8+1
(9+9)/2-->9
arr[9]是600,正好和600相等,此时找到了
相关文章:
几种常见的算法
一、冒泡排序法 冒泡排序法 原始数据:3 2 7 6 8 第1次循环:(最大的跑到最右边) 2 3 7 6 8(3和2比较,2<3 所以2和3交换位置) 2 3 7 6 8(3和7比较,3<7 所以不需要交…...
原生的cURL函数而不是 tp6框架的Http类,curl_init()、curl_setopt()和curl_exec()等cURL函数
GET请求示例: // 初始化 cURL $ch curl_init(); // 设置 cURL 选项 curl_setopt($ch, CURLOPT_URL, https://example.com/api/resource); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 执行 cURL 并获取返回结果 $response curl_exec($ch); // 关闭 cURL…...

Win10下在Qt项目中配置SQlite3环境
资源下载 官网资源:SQLite Download Page 1、sqlite.h sqlite-amalgamation-3450000.zip (2.60 MiB) 2、sqlite3.def,sqlite3.dll sqlite-dll-win-x64-3450000.zip (1.25 MiB) 3、 win10下安装sqlite3所需要文件 sqlite-tools-win-x64-3450000.zipht…...

Sentinel 轨道数据及下载
Sentinel卫星轨道文件在处理Sentinel卫星数据时发挥着关键作用。这些轨道文件包含了有关卫星在轨道上的运动、位置、姿态等信息,对于地理校正、成像几何校正以及多时相分析等方面具有重要作用。以下是Sentinel卫星轨道文件的主要作用: 地理校正ÿ…...
MD5 加密
任务: 接到一个任务,调用对方的接口,内容和密码,需要使用md5进行加密,再发送请求。 参数说明: 参数名称 说明 备注 timespan 时间戳 格式为yyyyMMddHHmmss pwd 密码 此处用原始密码时间戳做MD5加…...
在 Excel 中将列数据用单引号括起来并添加分隔符的解决方案
在 Excel 中,有时候我们需要将某一列的所有值连接在一起,并且每个值用单引号括起来,同时在每个值之间添加逗号和空格。这样的需求在数据处理和导出时比较常见。本文将介绍一种使用 Excel 函数解决这个问题的方法。 解决方案: 方…...

技术硬实力,阿里巴巴为什么要开源Spring Cloud Alibaba?
Spring Cloud Alibaba是阿里巴巴开源的一款高性能的微服务RPC框架,关于Spring Cloud Alibaba的详细介绍我这里就不啰嗦了,大家可以参考官网及相关源码,我这里只是想聊的是“阿里巴巴为什么要开源Spring Cloud Alibaba”,只要追根朔…...

2024 前端高频面试题之 HTML/CSS 篇
【前言】随着市场的逐渐恶劣,通过总结面试题的方式来帮助更多的coder,也是记录自己的学习过程,温故而知新。欢迎各位同胞大大点评补充~ 前端面试题之 HTML/CSS 篇 1、HTML 语义化?2、块级元素&内联样式3、盒子模型的理解&…...
实现将信息作为txt,pdf,图片的形式保存到电脑~
PrintableUtils作为输出信息的工具类: package org.example; import com.itextpdf.text.*; import com.itextpdf.text.Font; import com.itextpdf.text.pdf.PdfWriter; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; im…...

服务器变矿机,该如何应对?
开始 恶意的挖矿程序会导致服务器cpu的异常占用,很让人讨厌。起初,我只是使用top命令显示出占用cpu不正常的进程,发现其中一个进程占用了百分之九十九点几,然后通过kill -9 <PID>命令干掉它。但总是过不了几天,…...

2018年认证杯SPSSPRO杯数学建模A题(第一阶段)海豚与沙丁鱼全过程文档及程序
2018年认证杯SPSSPRO杯数学建模 探究海豚猎捕时沙丁鱼群的躲避运动模型 A题 海豚与沙丁鱼 原题再现: 沙丁鱼以聚成大群的方式来对抗海豚的捕食。由于水下光线很暗,所以在距离较远时,海豚只能使用回声定位方法来判断鱼群的整体位置…...
【Webpack】预处理器 - 常用loader介绍
选用合适的loader来处理不同的资源和不同的功能,以下是一些主流的loader,但这并不是全部,因为每时每刻都可能有新的loader 发布到 npm上 babel-loader babe-loader 用来处理ES6并将其编译为ESS,它使我们能够在最新的工程中使用最…...
lodash 的 _.groupBy 函数是怎么实现的?
说在前面 🎈lodash的_.groupBy函数可以将一个数组按照给定的函数分组,返回一个新对象。该函数接收两个参数:第一个参数是要进行分组的数组,第二个参数是用于分组的函数。该函数会对数组中的每个元素进行处理,返回一个值…...

(2024,ViM,双向 SSM 骨干,序列建模)利用双向状态空间模型进行高效视觉表示学习
Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0.摘要 3. 方法 3.1. 基础知识 3.…...

docker容器和常用命令
1.什么是容器 容器是隔离的环境中运行的一个 进程 , 如果进程结束 , 容器就会停止. 细致: 容器的隔离环境 , 拥有自己的 ip 地址 , 系统文件 , 主机名 , 进程管理 , 相当于一个 mini的系统 2.容器 vs 虚拟机 3.Docker极速上手指南 #1.安装相关依赖. sudo yum install -y …...
【征服redis9】快速征服lua脚本
lua脚本,这个名字总让人想歪,不过老外发明名字,我们只能跟着叫了。这个脚本语言在redis里和Nginx里都有用,所以我们就来看一下。 目录 1 lua的介绍与说明 2 lua的基本语句体验 3.Lua的数据结构和高级特性 1 lua的介绍与说明 …...

vue3.2二次封装antd vue 中的Table组件,原有参数属性不变
vue3.2中的<script setup>语法 在项目中多处使用到表格组件,所以进行了一个基础的封装,主要是通过antd vue 中表格的slots配置项,通过配合插槽来进行封装自定义表格; 这次主要的一个功能是编辑之后变成input框 修改了之后变成完成发送请求重新渲染表格: 子…...
GBASE南大通用分享,如何修改可信上下文
在以下示例中,假设该可信上下文对象 appserver 存在并启用。以下的 ALTER TRUSTED CONTEXT 语句将 appserver 可信上下文对象的对象方式重置为 DISABLE。当其处于该方式时, appserver 可信上下文仍然存在,但是它不能用于存取数据库服务器。 …...

冻结Prompt微调LM: T5 PET (a)
T5 paper: 2019.10 Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer Task: Everything Prompt: 前缀式人工prompt Model: Encoder-Decoder Take Away: 加入前缀Prompt,所有NLP任务都可以转化为文本生成任务 T5论文的初衷如…...
119 BFS和DFS解二叉树的所有路径
问题描述:给定一个二叉树,返回所有从根节点到叶子节点的路径。说明:叶子节点是指没有子节点的节点。 DFS求解:定义一个全局的链表,用来装所有的结果,通过DFS遍历,一旦遍历到当前节点没有子节点…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...