Java学习笔记--数组常见算法:数组翻转,冒泡排序,二分查找
一,数组翻转
1.概述:数组对称索引位置上的元素互换,最大值数组序号是数组长度减一
创建跳板temp,进行min和max的互换,然后min自增,max自减,当min>=max的时候停止互换,代表到中间值
用代码实现
public class Demo01Reverse {public static void main(String[] args) {//定义一个静态数组 int arr [] ={1,2,3,4,5,6,7};for(int min=0,max = arr.length-1;min<max;min++,max--){//进行换位int temp = arr[min];arr[min]= arr[max];arr[max]= temp;}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}}
}
二,冒泡排序
数组的排序,是将数组中的元素按照大小进行排序,默认都是以升序的形式进行排序,数组排序的方法很多,我们讲解的是数组的冒泡排序。
排序,都要进行数组 元素大小的比较,再进行位置的交换。冒泡排序法是采用数组中相邻元素进行比较换位。
arr[i](前一个元素) arr[i+1](后一个元素)
比如以下数组
5 4 3 2 1
进行0,1号位的数字比较
4 5 3 2 1
然后又进行1,2号位的数字比较
4 3 5 2 1
然后2,3号位比较
4 3 2 5 1
最后3,4号位比较
4 3 2 1 5
实现位置的交换依然和前面数组翻转一样,创建一个跳板temp进行交换
代码实现
首先,定义数组
public class Demo02Bubble {public static void main(String[] args) {int[] arr = {5,4,3,2,1};
进行第一轮冒泡
/* 第一圈 */for (int i = 0; i < arr.length; i++) {if(arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr [i+1];arr[i+1] = temp;}}
测试,出现警告
这是为什么呢
其实是循环的时候突破了数组的最大序号
因为arr.length就等于5,所以i能取到的最大值是4,所以i+1=5,突破了最大限制
改为arr.length-1
成功,然后进行第二圈
//第二圈for (int i = 0; i < arr.length-1; i++) {if(arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr [i+1];arr[i+1] = temp;}}
第二圈代码和第一圈一样,也没问题,但也和第一圈一样比较了4次,但我们可以不必做这个重复功,因为第一次比较完了一个数,所以我们可以减去一次循环来表示可以少比较的次数,所以可以写成arr.length-1-1,最后面减的这个数可以看成是前面冒泡过的数的个数(圈数)
//第二圈for (int i = 0; i < arr.length-1-1; i++) {if(arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr [i+1];arr[i+1] = temp;}}
现在进行第三圈第四圈,同样我们减去前面冒泡过的数的个数
//第三圈for (int i = 0; i < arr.length-1-2; i++) {if(arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr [i+1];arr[i+1] = temp;}}//第四圈for (int i = 0; i < arr.length-1-3; i++) {if(arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr [i+1];arr[i+1] = temp;}}
运行结果
但我们可以再进行优化,这几圈的变化非常细微,只有一个数一个位置在变
如果最后面减的数是前面的圈数的话,那也就等于i啊,我们可以再在外面套一层循环,利用自加i来代替这几圈唯一变的减数
/*
外层循环代表比较了几圈n-1圈
*/for (int j = 0; j < arr.length-1; j++) {for (int i = 0; i < arr.length-1-j; i++) {/*内层循环代表每一圈比较的次数每圈都少比较一次*/if(arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr [i+1];arr[i+1] = temp;}}}
由此而来,化繁为简,减小了时间,空间复杂度
完整代码如下
public class Demo02Bubble {public static void main(String[] args) {int[] arr = {5,4,3,2,1};/*第一圈越界原因:当i变化到4的时候-> arr[4]>arr[5] -> 直接操作了5索引,所以越界了越界解决:我们可以让arr.length-1如果arr.length-1-> 比较就是i<4 -> 此时i最大可以变化到3当i变化到3时 -> arr[3]>arr[4] -> 正好是最后两个元素进行比较*/for (int i = 0; i < arr.length-1-0; i++) {if(arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr [i+1];arr[i+1] = temp;}}//第二圈/*for (int i = 0; i < arr.length-1-1; i++) {if(arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr [i+1];arr[i+1] = temp;}}*///第三圈/*for (int i = 0; i < arr.length-1-2; i++) {if(arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr [i+1];arr[i+1] = temp;}}*///第四圈/*for (int i = 0; i < arr.length-1-3; i++) {if(arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr [i+1];arr[i+1] = temp;}}*//*外层循环代表比较了几圈n-1圈*/for (int j = 0; j < arr.length-1; j++) {for (int i = 0; i < arr.length-1-j; i++) {/*内层循环代表每一圈比较的次数每圈都少比较一次*/if(arr[i]>arr[i+1]){int temp = arr[i];arr[i] = arr [i+1];arr[i+1] = temp;}}}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}}
}
三,二分查找(一尺之锤,日取其半,万世不竭)
1.前提:数组中的数据必须是有序的
2.查询思想:
a.老式查询:遍历数组,一个一个比较 -> 查询效率慢
b.二分查找:每次找中间索引对应的元素进行比较查询(每一次查询少一半数据)
首先,因为min和max会因为查找数所在数组的位置不同而改变所以不能定义min就是arr[0]或max就是arr[8],min默认为0,max为arr.length-1,mid就是二者取中。
key为查询数,是指想查的数组中的数,查询出的是数组序数代表 含的数。
前提:当min<=max时
当查询数大于或小于数组序数上所代表的数时,通过移动min和max直接排掉一半的数,来不断的锁定范围,直到找到查询数所在的位置(这个方法很像一尺之锤,日取其半,万世不竭,不过是有目标的取),当查询数等于数组序数上所代表的数时,停止查找,返回序数表示找到了。
当然还有特殊情况,就是查询数不存在在数组中,那么当min>max时,就不找了,返回-1表示找不到。
代码实现
public static int binary(int[] arr,int data){//定义三个变量,分别代表最大索引,最小索引,中间索引int min = 0;int max = arr.length-1;int mid = 0;//查找while (min<=max){mid = (min+max)/2;if(data>arr[mid]){min = mid+1;}else if(data<arr[mid]){max = mid-1;}else{return mid;}}return -1;}
我们发现代码实现和理论方法步骤不同,没有在一开始表示mid = (min+max)/2,因为要循环的算中间索引,在一进入循环时,在while(外层循环)内,再进行计算。
在main函数内调用方法进行输出,完整代码如下
public class Demo03Binary {public static void main(String[] args) {int[] arr = {1,2,3,4,5,6,7,8,9};int index = binary(arr, 7);System.out.println(index);}public static int binary(int[] arr,int data){//定义三个变量,分别代表最大索引,最小索引,中间索引int min = 0;int max = arr.length-1;int mid = 0;//查找while (min<=max){mid = (min+max)/2;if(data>arr[mid]){min = mid+1;}else if(data<arr[mid]){max = mid-1;}else{return mid;}}return -1;}
}
输入7
相关文章:
Java学习笔记--数组常见算法:数组翻转,冒泡排序,二分查找
一,数组翻转 1.概述:数组对称索引位置上的元素互换,最大值数组序号是数组长度减一 创建跳板temp,进行min和max的互换,然后min自增,max自减,当min>max的时候停止互换,代表到中间值 用代码实…...
ARM 架构(Advanced RISC Machine)精简指令集计算机(Reduced Instruction Set Computer)
文章目录 1、ARM 架构ARM 架构的特点ARM 架构的应用ARM 架构的未来发展 2、RISCRISC 的基本概念RISC 的优势RISC 的应用RISC 与 CISC 的对比总结 1、ARM 架构 ARM 架构是一种低功耗、高性能的处理器架构,广泛应用于移动设备、嵌入式系统以及越来越多的服务器和桌面…...
7.STM32之通信接口《精讲》之USART通信---多字节数据收发(数据包的模式:HEX数据包和文本数据包)
根据上一节的HEX数据包的设计完成,本节将完成文本数据包的编写,(HEX数据包其实本质就是原始数据,文本数据包我么要接收到还要对照ASCll进行解析封装) 有不懂的可参考上一节的讲解!!ÿ…...
基于Vue+SpringBoot的求职招聘平台
平台概述 本平台是一个高效、便捷的人才与职位匹配系统,旨在为求职者与招聘者提供一站式服务。平台内设三大核心角色:求职者、招聘者以及超级管理员,每个角色拥有独特的功能模块,确保用户能够轻松完成从信息获取到最终录用的整个…...
WebRTC 和 WebSocket
WebRTC 和 WebSocket 是两种不同的技术,虽然它们都用于在浏览器之间进行通信,但它们的设计目标和使用场景有所不同。以下是它们之间的主要区别: 目的和使用场景 WebRTC: 主要用于实现实时音视频通信。 支持点对点(P2P)…...
小车综合玩法--5.画地为牢
一、实验准备 前面我们利用四路巡线模块巡线,现在我们利用这个特性,用黑线将小车围起来,让小车一直在我们围的圈内运动。 1.小车接线已安装,且安装正确 2.调试四路巡线模块遇黑线时指示灯亮。不是黑线时指示灯灭。 二、实验原理…...
数据库课程设计全流程:方法与实例解析
--- ### 一、数据库课程设计概述 数据库课程设计是学习数据库理论知识的重要实践环节,旨在帮助学生掌握数据库设计和应用系统开发的完整流程,包括需求分析、数据库设计、功能实现以及性能优化。 #### **设计目标** 1. 掌握数据库设计的基本步骤和原则…...
用Ruby编写一个自动化测试脚本,验证网站登录功能的正确性。
测试准备:从江河湖海到代码世界的奇妙之旅 亲爱的朋友们,你们好!今天我要带你们进入一个神奇的世界——测试的世界。在这里,我们将会看到各种各样的测试用例,它们就像江河湖海一样,汇聚在一起,…...
跳表 | 基本概念 | 代码实现
文章目录 1.跳表的基本概念2.跳表的结构3.跳表的增删改查4.完整代码 1.跳表的基本概念 跳表的本质是一种查找结构,一般查找问题的解法分为两个大类:一个是基于各种平衡树,一个是基于哈希表,跳表比较的特殊,它独成一派…...
分数加减
#include <stdio.h> #include <stdlib.h>// 求最大公因数 int gcd(int a, int b) {return b 0? a : gcd(b, a % b); }// 化简分数 void simplify(int *num, int *den) {int g gcd(*num, *den);*num / g;*den / g;if (*den < 0) {*num * -1;*den * -1;} }//…...
基于卷积神经网络的皮肤病识别系统(pytorch框架,python源码,GUI界面,前端界面)
更多图像分类、图像识别、目标检测等项目可从主页查看 功能演示: 皮肤病识别系统 vgg16 resnet50 卷积神经网络 GUI界面 前端界面(pytorch框架 python源码)_哔哩哔哩_bilibili (一)简介 基于卷积神经网络的皮肤病识…...
QT与嵌入式——获取网络实时时间
目录 1、使用QT通过网络API接口获取网络实时时间 1.1、首先在网上找一个获取实时时间的API接口 1.2、 根据第一步获取的链接来发送请求 1.3、通过connect链接信号与槽 注意的点: 2、为什么需要网络实时时间 3、获取本机的实时时间 4、顺带提一句 1、使用QT通过…...
优化装配,提升品质:虚拟装配在汽车制造中的关键作用
汽车是各种零部件的有机结合体,因此汽车的装配工艺水平和装配质量直接影响着汽车的质量与性能。在汽车装配过程中,经常会发生零部件间干涉或装配顺序不合理等现象,且许多零部件制造阶段产生的质量隐患要等到实际装配阶段才能显现出来…...
Bug的严重等级和优先级别与分类
目录 前言 1. Bug的严重等级定义 2.Bug的优先等级 3.一般 BUG 的正规的处理流程 4.BUG严重等级划分 5.BUG紧急程度定义 前言 Bug是指在软件开发或者系统运行过程中出现的错误、缺陷或者异常情况。它可能导致系统无法正常工作、功能不完整、数据错误或者界面异常等问题。 …...
游戏引擎学习第13天
视频参考:https://www.bilibili.com/video/BV1QQUaYMEEz/ 改代码的地方尽量一张图说清楚吧,懒得浪费时间 game.h #pragma once #include <cmath> #include <cstdint> #include <malloc.h>#define internal static // 用于定义内翻译单元内部函数 #…...
bind返回失败(ctrl+c)结束后不能再次加载
问题现象(VxWorks): 在测试的时候发现使用ctrlc打断程序后再次调用bind绑定失败 错误返回 0x30 问题分析: 1、程序没有开启端口复用。 2、程序在使用ctrlc打断后 vxWorks的打断和linux不相同,并没有清除底层的端口&a…...
菜鸟驿站二维码/一维码 取件识别功能
特别注意需要引入 库文 ZXing 可跳转: 记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.…...
23种设计模式-备忘录(Memento)设计模式
文章目录 一.什么是备忘录设计模式?二.备忘录模式的特点三.备忘录模式的结构四.备忘录模式的优缺点五.备忘录模式的 C 实现六.备忘录模式的 Java 实现七.总结 类图: 备忘录设计模式类图 一.什么是备忘录设计模式? 备忘录设计模式(…...
搜维尔科技:Manus遥操作五指机械手专用手套惯性高精度虚拟现实
Manus遥操作五指机械手专用手套惯性高精度虚拟现实 搜维尔科技:Manus遥操作五指机械手专用手套惯性高精度虚拟现实...
MySql面试题.运维面试题之五
《(全国)MySQL数据库DBA测试题-第1套》 卷面总分 题号 单选题 多选题 判断题 100 题分 42 40 18 得分 一、单选题(每题3分,共计42分;得分____) 1. 二进制rpm包安装的mysql数据库,默认的数据文件存放在如下哪个目录里? A、/usr/local/mysql B、/tmp/ C、/var/lib/my…...
小程序-基于java+SpringBoot+Vue的小区服务管理系统设计与实现
项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:…...
JWT 过期后 自动刷新方案
JWT(JSON Web Token)广泛应用于现代 Web 开发中的认证与授权,它以无状态、灵活和高效的特点深受开发者欢迎。然而,JWT 的一个核心问题是 Token 过期后如何处理。本文将总结常见的解决方案,分析其优缺点,并帮…...
react-amap海量点优化
前言:高版本的react-amap 支持MassMarkers 组件用于一次性添加大量的标记点。本次优化的海量点是在低版本react-amap的基础上。官方推荐使用聚合useCluster属性来优化海量点的渲染。 直接附上代码: import React, { Component } from "react"…...
GRU(门控循环单元)详解
1️⃣ GRU介绍 前面介绍的LSTM可以有效缓解RNN的梯度消失问题,但是其内部结构比较复杂,因此衍生出了更加简化的GRU。GRU把输入门和遗忘门整合成一个更新门,并且合并了细胞状态和隐藏状态。于2014年被提出 2️⃣ 原理介绍 GRU的结构和最简单…...
【代码随想录|回溯算法排列问题】
491.非减子序列 题目链接. - 力扣(LeetCode) 这里和子集问题||很像,但是这里要的是非递减的子序列,要按照给的数组的顺序来进行排序,就是如果我给定的数组是[4,4,3,2,1],如果用子集||的做法先进行排序得到…...
Azure Kubernetes Service (AKS)资源优化策略
针对Azure Kubernetes Service (AKS)的资源优化策略,可以从多个维度进行考虑和实施,以提升集群的性能、效率和资源利用率。以下是一些关键的优化策略: 一、 Pod资源请求和限制 设置Pod请求和限制:在YAML清单中为所有Pod设置CPU和…...
R语言 | 宽数据变成一列,保留对应的行名和列名
对应稀疏矩阵 转为 宽数据框,见 数据格式转换 | 稀疏矩阵3列还原为原始矩阵/数据框,自定义函数 df3toMatrix() 目的:比如查看鸢尾花整体的指标分布,4个指标分开,画到一个图中。每个品种画一个图。 1.数据整理&#…...
RTSP播放器EasyPlayer.js播放器在webview环境下,PC和安卓能够正常播放,IOS环境下播放器会黑屏无法播放
流媒体技术分为顺序流式传输和实时流式传输两种。顺序流式传输允许用户在下载的同时观看,而实时流式传输则允许用户实时观看内容。 流媒体播放器负责解码和呈现内容,常见的播放器包括VLC和HTML5播放器等。流媒体技术的应用场景广泛,包括娱乐…...
.NET周刊【11月第3期 2024-11-17】
国内文章 .NET 9使用Scalar替代Swagger https://www.cnblogs.com/netry/p/18543378/scalar-an-alternative-to-swagger-in-dotnet-9 .NET 9 移除了 Swashbuckle.AspNetCore,因为其维护不力,并转向 Microsoft.AspNetCore.OpenApi。除了 Swashbuckle&am…...
c语言数据22数组使用
1.1数组分配的空间 int a[10]{1,2,3,4,5,6,7,8,9,10};//分配空间 元素类型大小int4*元素个数1040byte 元素之间空间连续 数组名代表数组首元素地址;a 取的是a[0]的地址;&a 是整个数组的地址 说明: 数组首元素地址: 0号元…...
软件公司网站设计与制作/网络公关公司收费
文章讲的是大数据驱动移动APP经济时代降临,美国移动APP行业协会(The App Association,简称ACT)发布了关于APP经济的第五份年度报告,并揭示了两年间在美国提供了大约11万个相关工作岗位。而在未来,随着移动应用程序从云端接收和发送…...
湖南网站建设kaodezhu/网络营销手段有哪些方式
安装的是解压版的MYSQL,具体配置参考:https://jingyan.baidu.com/article/9c69d48f85032f13c9024e15.html 。1:解压之后copy 一个my.ini文件 然后添加字节编码配置:[client]default-character-setgbk[mysqld]character-set-serverutf8指定数据…...
北京高级网站建设/营业推广方案
什么是事件事件是视图层到逻辑层的通讯方式。事件可以将用户的行为反馈到逻辑层进行处理。事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。事件对象可以携带额外信息,如 id, dataset, touc…...
免费网站建设公司/上海关键词推广
“Shift空格” 是全角和半角的切换...
网站设置关于我们怎么做/seo培训机构排名
作者:闲鱼技术-国有 讲师介绍 国有,闲鱼架构团队负责人。在7月13号落幕的2019年Archsummit峰会上就近一年来闲鱼在Flutter&FaaS一体化项目上的探索和实践进行了分享。 传统NativeWeb服务端混合开发的挑战 随着无线,IoT的发…...
佛山市网站建设公司/博客网站登录
本文价值与收获 看完本文后,您将能够作出下面的界面 Jietu20200507-094517@2x.jpg Jietu20200507-094537.gif 看完本文您将掌握的技能 掌握popover基础使用代码 import SwiftUIstruct ContentView: View {var body: some View {PopoverExample()} }struct ContentView_Previe…...