【Java开发实训】day05——数组常见算法

news2025/4/7 4:42:14

目录

一、数组翻转

1.1示例代码

1.2适用场景

二、冒泡排序

2.1示例代码

2.2适用场景

三、二分查找

3.1示例代码

3.2适用场景


🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。

💡本文由Filotimo__✍️原创,首发于CSDN📚。

📣如需转载,请事先与我联系以获得授权⚠️。

🎁欢迎大家给我点赞👍、收藏⭐️,并在留言区📝与我互动,这些都是我前进的动力!

🌟我的格言:森林草木都有自己认为对的角度🌟。


一、数组翻转

数组翻转是指将数组中的元素按照对称索引位置互相交换。例如,如果有一个数组 {1, 2, 3, 4, 5},翻转后变成 {5, 4, 3, 2, 1}。

1.1示例代码

数组翻转的示例代码:

public class ArrayReverseExample {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        
        System.out.println("原始数组:");
        printArray(array);
        
        reverseArray(array);
        
        System.out.println("\n翻转后的数组:");
        printArray(array);
    }
    
    public static void reverseArray(int[] array) {
        int start = 0;
        int end = array.length - 1;
        while (start < end) {
            int temp = array[start];
            array[start] = array[end];
            array[end] = temp;
            start++;
            end--;
        }
    }
    
    public static void printArray(int[] array) {
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }
}

运行截图:

在上面代码中,reverseArray 方法实现了数组翻转的逻辑:使用两个指针 start 和 end,分别指向数组的起始和末尾元素。在循环中,将 start 和 end 指向的元素互换,然后将 start 向右移动一位,end 向左移动一位,直到 start 不小于 end。

1.2适用场景

数组翻转的适用场景:

①        倒序输出:当需要将数组中的元素按照相反的顺序输出时,可以先对数组进行翻转,然后再遍历输出元素。

②        字符串反转:在字符串处理中,有时需要将字符串进行反转操作,此时可以将字符串转换为字符数组,对字符数组进行翻转操作,然后再将字符数组转换回字符串。

③        实现栈和队列:在实现栈(后进先出)或队列(先进先出)这样的数据结构时,可以使用数组进行存储,并通过翻转数组来实现不同的操作顺序。

二、冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数组,比较每对相邻的元素,并依次交换顺序错误的元素,直到没有需要交换的元素为止。这个过程类似于水泡在水中上浮的过程,故名冒泡排序。

2.1示例代码

冒泡排序的示例代码:

public class BubbleSortExample {
    public static void main(String[] args) {
        int[] array = {5, 1, 12, -5, 16};
        
        System.out.println("原始数组:");
        printArray(array);
        
        bubbleSort(array);
        
        System.out.println("\n排序后的数组:");
        printArray(array);
    }
    
    public static void bubbleSort(int[] array) {
        int n = array.length;
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1 - i; j++) {
                if (array[j] > array[j + 1]) {
                    // 交换 array[j] 和 array[j + 1]
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
    }
    
    public static void printArray(int[] array) {
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }
}

运行截图:

在上面代码中,bubbleSort 方法实现了冒泡排序算法:外层循环 for (int i = 0; i < n - 1; i++) 控制排序的轮数,其中 n 是数组的长度。内层循环 for (int j = 0; j < n - 1 - i; j++) 在每一轮中遍历数组,并比较相邻元素。如果前一个元素比后一个元素大,则交换它们的位置,确保较大的元素向右移动。

2.2适用场景

冒泡排序的适用场景:

①        小规模数据排序:冒泡排序算法简单易懂,适合处理小规模的数据(一般小于100个元素),在小数据量下性能良好。

②        几乎已排序的数组:如果数组的元素大部分已经处于正确位置,冒泡排序的性能会相对较好,因为它的优化版本可以提前结束排序过程。

③        实时数据流排序:在某些实时系统中,如果数据流入非常缓慢且对排序的实时性要求不高,可以用冒泡排序进行简单的处理。

三、二分查找

二分查找是一种高效的查找算法,适用于已排序的数组或列表。它通过反复将查找范围减半来定位目标值,直到找到目标或确定目标不存在为止。(前提:数组中的数据必须是有序的)

3.1示例代码

二分查找的示例代码:

public class BinarySearchExample {
 public static void main(String[] args) {
  int[] array = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
  int target = 11;

  int index = binarySearch(array, target);

  if (index != -1) {
   System.out.println("找到目标 " + target + " ,索引位置为:" + index);
  } else {
   System.out.println("目标 " + target + " 未找到。");
  }
 }

 public static int binarySearch(int[] array, int target) {
  int left = 0;
  int right = array.length - 1;

  while (left <= right) {
   int mid = left + (right - left) / 2;

   // 如果目标值在中间位置
   if (array[mid] == target) {
    return mid;
   }

   // 如果目标值比中间值小,向左侧继续查找
   if (array[mid] > target) {
    right = mid - 1;
   }

   // 如果目标值比中间值大,向右侧继续查找
   if (array[mid] < target) {
    left = mid + 1;
   }
  }

  // 如果没有找到目标值,返回 -1
  return -1;
 }
}

运行截图:

在上面代码中,binarySearch 方法实现了二分查找的算法:使用 left 和 right 分别表示当前查找范围的左右边界。在每一轮循环中,计算中间位置 mid。如果目标值等于 array[mid],则找到目标值,返回 mid。如果目标值小于 array[mid],则更新 right,缩小查找范围到左半部分。如果目标值大于 array[mid],则更新 left,缩小查找范围到右半部分。若最终 left > right,表示未找到目标值,返回 -1。

3.2适用场景

二分查找的适用场景:

①        有序数据:二分查找要求数据是有序的,因此适用于已经排序好的数组或列表中查找特定元素。

②        大数据量的查找:相比于线性搜索,二分查找在大数据量的情况下性能更好,因为它每次可以排除一半的数据。

③        频繁查找:如果需要多次查找同一个有序集合中的元素,一次排序、多次查找的场景适合使用二分查找。

④        需求较高的性能:对查找性能有较高要求的场景,二分查找是一个高效的算法,时间复杂度为 O(log n)。

⑤        对内存要求低:相比于哈希表等数据结构,二分查找不需要额外的存储空间,对内存要求较低。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1941626.html

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

相关文章

Elasticsearch中任务管理怎么做?

一个ES集群研发在清理数据时使用了delete_by_query&#xff0c;导致集群性能严重受影响&#xff0c;影响了正常的业务。为了快速恢复集群正常状态&#xff0c;考虑把还在进行的delete_by_query任务清除掉。 先查看当前集群的任务 GET _cat/tasks?v发现delete_by_query的任务…

Git笔记:(上传Git、Git获取文件版本、删除、统计)

目录 一、上传文件到github 1.1 配置用户名和邮箱 1.2 初始化本地仓库 1.3 添加项目目录下所有文件至本地仓库 1.4 使用如下命令加入注释提交 1.5 将本地仓库与远程仓库相连接 1.6 将本地仓库中的文件推送至指定的远程仓库中 二、git获取不同版本 2.1 git下载特定历史…

[MySQL]02 存储引擎与索引,锁机制,SQL优化

Mysql存储引擎 可插拔式存储引擎 索引是在存储引擎底层上实现的 inno DB MySQL默认存储引擎: inno DB高可靠性和高性能的存储引擎 DML操作遵循ACID模型支持事务行级锁,提高并发访问性能支持外键 约束,保证数据完整性和可靠性 MySAM MySAM是MySQL的早期引擎 特点: 不支持事…

【数据结构_C语言】归并排序—文件类型

文章目录 1.排序定义2. 代码实现 1.排序定义 内排序&#xff1a;数据量相对少一些&#xff0c;可以放到内存中排序。 外排序&#xff1a;数据量较大&#xff0c;内存中放不下&#xff0c;数据放到磁盘文件中&#xff0c;需要排序。 归并排序&#xff1a; 2. 代码实现 void…

基于CNN-BiLSTM的数据回归预测

代码原理 基于CNN-BiLSTM的数据回归预测是一种结合卷积神经网络&#xff08;CNN&#xff09;和双向长短期记忆网络&#xff08;BiLSTM&#xff09;的混合模型&#xff0c;用于处理和预测时间序列数据。以下是该方法的简单原理及流程&#xff1a; 原理 &#xff08;1&#xf…

OSGB整体或自定义区域转换为3DTiles

工具 OSGB源数据灵易智模倾斜摄影编辑平台(下称OPEditor) 操作步骤 打开倾斜摄影 打开软件&#xff08;登录即注册&#xff0c;直接用手机号登录&#xff09;使用OPEditor打开OSGB原始倾斜数据&#xff0c;将会看到如下页面 整体导出为3DTiles 在右侧节点树上鼠标右键点…

“为你写诗”,与ai“推敲”码字:第一次在严谨的csdn发布只有“思绪”没有代码的笔记(ai对话实录)

与ai“推敲”码字&#xff0c;第一次在严谨的csdn发布只有“思绪”没有代码的笔记(ai对话实录)。 (笔记模板由python脚本于2024年07月22日 21:13:08创建&#xff0c;本篇笔记适合本文无关代码&#xff0c;爱思考穷探究的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&…

力扣21-30题(数学的简单的结束和数组的前几道)

20240721 1.题和解析693. 交替位二进制数405. 数字转换为十六进制数171 excel 表序列号 从这之后的是数组了2011. 执行操作后的变量值1929. 数组串联1720. 解码异或后的数组异或解析&#xff1a;2574. 左右元素和的差值101. 对称二叉树LCP 06. 拿硬币1365. 有多少小于当前数字的…

org.springframework.context.ApplicationContext发送消息

1、创建消息的实体类 package com.demo;/*** 监听的实体类**/ public class EventMessage {private String name;public EventMessage(String name) {this.name name;}public String getName() {return name;}public void setName(String name) {this.name name;} }2、创建消…

three.js NDC空间转视图空间(getViewPosition)

three.js NDC空间转视图空间 NDC空间转视图空间, 比较常用。很多效果依赖于此。 包括: GTAOShaderReflectorForSSRPassSSRShader 下面看一下它的庐山真面目。 1、计算clipW 视图空间(view) 应用投影矩阵后转换到 剪裁空间(clip)。 [ A 0 B 0 0 C D 0 0 0 E F 0 0 − 1 0 ]…

Truenas scale 配置 Official Zerotier 并设置一直固定Zerotier IP

Zerotier 安装 TrueNAS Scale -> Apps -> Discover Apps -> 搜索 Zerotier 并安装Netwoek 中填入你 zerotier 网页中的的 Network IDAuto Token (API key) zerotier网页的 Account -> API Access Tokens -> New Tokenidentity.secret 和 identity.public 通过 …

国际化技术参考

一、概述 国际化就是用户可以选择对应的语言,页面展示成对应的语言; 一个系统的国际化按照信息的所在位置,可以分为三种国际化信息: 前端页面信息后端提示信息数据库的字典类信息二、前端页面国际化 使用i18n库实现国际化 i18n国际化库思路:通过jquery或者dom操作拿到需…

【动态规划】打家劫舍

动态规划的四个解题步骤&#xff1a; 1、定义子问题 2、写出子问题的递推关系 3、确定dp数组的计算顺序 4、空间优化&#xff08;可选&#xff09;上一篇博客学的有点杂乱&#xff0c;这一篇从解题步骤方面整理一下动态规划这一章。 打家劫舍&#xff08;难度&#xff1a;中等…

C++进阶中继承的全部主要内容

小编在学习完C中继承的内容之后&#xff0c;觉得继承的内容很重要&#xff0c;所以今天给大家带来的内容就是继承的主要内容&#xff0c;今天的内容包括继承的定义与语法&#xff0c;继承方式与权限&#xff0c;基类和派生类的类型转换赋值&#xff0c;继承中的隐藏&#xff0c…

数据跨境法案:美国篇下

数据跨境法案美国篇下主要介绍2018年《出口管制改革法案》(ECRA)、2018 年《外国投资风险审查现代化法案》(FIRRMA) 和《强化海外关键出口国家框架法》&#xff08;ENFORCE&#xff09;。其中 ECRA法案和 FIRRM 法案作为2019财年约翰S麦凯恩国家国防授权法&#xff08;NDAA&…

MySQL定时备份数据,并上传到oss

1.环境准备 1.安装阿里云的ossutil 2.安装mysql 2.编写脚本 脚本内容如下 #!/bin/bash # 数据库的配置信息&#xff0c;根据自己的情况进行填写 db_hostlocalhost db_usernameroot db_passwordroot db_namedb_root # oss 存贮数据的bucket地址 bucket_namerbsy-backup-buck…

开源发票识别InvoiceNet项目Windows部署踩坑记(1)

今天安装在github上的InvoiceNet开源项目&#xff0c;准备对它进行测试&#xff0c;安装过程出现了一些问题&#xff0c;做个记录&#xff0c;给遇到兄弟爬坑。 第一个问题&#xff0c;conda的问题&#xff0c; 这是另外一个包管理器&#xff0c;不仅仅可以管理python的虚拟…

如何通过smtp设置使ONLYOFFICE协作空间服务器可以发送注册邀请邮件

什么是ONLYOFFICE协作空间 ONLYOFFICE协作空间&#xff0c;是Ascensio System SIA公司出品的&#xff0c;基于Web的&#xff0c;开源的&#xff0c;跨平台的&#xff0c;在线文档编辑和协作的解决方案。在线Office包含了最基本的办公三件套&#xff1a;文档编辑器、幻灯片编辑…

XXE:XML外部实体引入

XXE漏洞 如果服务器没有对客户端的xml数据进行限制&#xff0c;且版本较低的情况下&#xff0c;就可能会产生xxe漏洞 漏洞利用流程 1.客户端发送xml文件&#xff0c;其中dtd存在恶意的外部实体引用 2.服务器进行解析 3.服务器返回实体引用内容 危害&#xff1a;任意文件读…

【C语言】 约瑟夫环,循环链表实现

1、循环链表实现约瑟夫环&#xff0c;每次经过特定步数删除一个元素 //looplist.h #ifndef LOOPLIST_H #define LOOPLIST_H #include<stdio.h> #include<string.h> #include<stdlib.h>typedef int datatype;typedef struct Node {union {int len;datatype d…