数据结构算法 - 数组 Array

一、概念

结构是一种线性表(元素排列成直线的结构),创建数组会开辟一块连续的内存空间,长度固定无法更改,元素可以重复且只能是同一种类型(Object类型数组除外)。
优点查询快:由于元素是连续存储的,带有索引查询起来快。
缺点增删慢:由于初始化后长度固定无法更改,增删元素只能用一个新的数组去存储。

二、一维数组

2.1 初始化

动态初始化指定数组长度,元素由系统分配(值都为null)。
格式:数据类型[] 数组名称= new 数据类型[元素个数]
静态初始化指定元素,长度由系统分配。
数据类型[] 数组名称 = { 元素1, 元素2, 元素3 }
//动态初始化
int[] arr = new int[5];    //推荐
int arr[] = new int[5];
//静态初始化
int[] arr = { 1, 2, 3 }    //推荐
int[] arr = new int[] { 1, 2, 3 }

2.2 获取、赋值

int x = arr[1] //获取元素
arr[2] = 4    //对元素赋值
int len = arr.length    //获取数组长度
int[] arr2 = arr    //复制数组,只是赋值了引用,并没有创建新数组,对arr中元素的修改会影响arr2

2.3 增删

数组长度不可改变,在处理固定大小数据的时候性能更好,有增删需求推荐使用 ArrayList,否则需要遍历旧数组对元素进行操作后存储到新数组中,或者遍历旧数组对目标元素位置后面的元素索引+1或-1即整体向前或向后移动1位。

2.4 遍历

for(int i = 0; i < arr.length; i++)    //for循环
for(int i : arr)    //for-each循环

2.5 查找

2.5.1 顺序查找

从头到尾遍历,返回值在数组中第一次出现的位置(即使有相同的元素)。

public int getIndex(int[] arr, int targetValue) {
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] == targetValue) {
            return i;
        }
    }
    return -1;    //索引不存在负数,以此表达无结果
}

2.5.2 折半查找 / 二分查找

适用于数组中元素数量较大时,但必须保证元素是排好序的(升序、降序)。

//方式一
public int halfSearch(int[] arr, int targetValue) {
    int min = 0;   //最小索引
    int max = arr.length - 1;  //最大索引
    int mid = (min + max) / 2 ; //中间值索引
    while (arr[mid] != targetValue) {
        if (arr[mid] < targetValue) {
            min = mid + 1;
        } else if (arr[mid] > targetValue) {
            max = mid - 1;
        }
        if (min > max) return -1;   //最值交叉无法折半,没有找到
        mid = (min + max) / 2;
    }
    return mid;
}
//方式二
public int halfSearch2(int[] arr, int targetValue) {
    int min = 0;   //最小索引
    int max = arr.length - 1;  //最大索引
    while(min <= max) {
        int mid = (min + max) / 2 ; //中间值索引
        if (arr[mid] < targetValue) {
            min = mid + 1;
        } else if (arr[mid] > targetValue) {
            max = mid - 1;
        } else {
            return mid;
        } 
    }
    return -1;    //若想把 targetValue 插入还保持数组有序,则 -1 改为 min
}

2.6 排序

实际开发中直接用 Arrays.sort(arr)

2.6.1 选择排序

内循环一次,最值出现在头部索引位置。

public void selectSort(int[] arr) {
    //-1是最后一个元素不跟自己比较
    for (int i = 0; i < arr.length -1; i++) {
        //j+1是避免第一个元素跟自己比较
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[i] > arr[j]) {    //改成 < 则是从小到大排序
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

2.6.2 冒泡排序

内循环一次,最值出现在尾部索引位置。有N个元素排序,外循环 N-1 次,内循环 N-i-1 次。

public void bubbleSort(int[] arr) {
    //-1是最后一个元素不跟自己比较
    for (int i = 0; i < arr.length - 1; i++) {
        //j=0是每次从0开始比较,-i是每一轮元素减少1个,-1是避免索引越界
        for (int j = 0; j < arr.length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {    //改成 < 则是从小到大排序
                //将两个元素互换位置
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

三、二维数组

(一维)数组中的每个元素也是一个(二维)数组。

3.1 命名格式

//正确写法
int[][] arr1 = new int[3][2];
//以下两种IDE会提示是C语言风格,让写成第一种
int arr2 [][] = new int[3][2];
int[] arr3[] = new int[3][2];
//以下这种IDE也会提示C语言风格,a和b是两个变量,a是一维数组,b是二维数组
int[]x,y[] = new int[3][2];
//会让写成这样
int[]a;
int[][] b = new int[3][2];

3.2 初始化

int[][] arr1 = new int[3][2];
System.out.println(arr1[1]);    //打印一维数组元素默认值为内存地址值
System.out.println(arr1[1][1]); //打印二维数组元素默认值为0
int[][] arr2 = new int[3][];
System.out.println(arr2[1]);    //打印一维数组元素默认值为null
System.out.println(arr2[1][1]); //打印二维数组元素报错,因为一维元素是null
arr2[0] = new int[2];   //对二维数组元素赋值后,打印一维数组元素默认值为地址值,二维数组元素默认值为0
int[][] arr3 = { {1,2},{3,4},{5,6} };   //打印一维数组元素默认值为地址值

3.3 遍历

for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr[i].length; j++) {
        
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

对话奇酷网络董事长吴渔夫: 迟到的游戏公司会被AI浪潮卷入海底

“ 迟到的游戏公司会被无形的 AI 浪潮卷入海底。” 整理 | 梦婕 编辑 | 云舒 出品&#xff5c;极新 2024年3月4日&#xff0c;在极新与吴渔夫的对话中&#xff0c;吴渔夫多次呼吁“全力拥抱AI”。在这场AI浪潮中&#xff0c;作为中国网游的先锋&#xff0c;他带着 25 年“中…

外包干了1个月,技术明显进步。。。

我是一名大专生&#xff0c;自19年通过校招进入湖南某软件公司以来&#xff0c;便扎根于功能测试岗位&#xff0c;一晃便是近四年的光阴。今年8月&#xff0c;我如梦初醒&#xff0c;意识到长时间待在舒适的环境中&#xff0c;已让我变得不思进取&#xff0c;技术停滞不前。更令…

GraalVM:新一代跨语言虚拟机的崛起

有朋友后台私信让聊聊GraalVM&#xff0c;目前这玩意我只自己尝鲜搞过&#xff0c;没搞过线上&#xff0c;后续有机会会补充个实践 其实&#xff0c;随着信息技术的快速发展&#xff0c;编程语言多样化已成为软件开发领域的常态。为了满足不同编程语言间的互操作性和性能需求&a…

Java特性之设计模式【组合模式】

一、组合模式 概述 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计模式属于结构型模式&#x…

隐私计算实训营学习一:数据可信流通,从运维信任到技术信任

文章目录 一、数据可信流通二、数据可信流通的技术信任基础三、技术信任开启数据密态时代&#xff0c;保障广域数据可信流通 一、数据可信流通 可信数据流通体系&#xff1a;数据二十条第一次明确提出可信流通&#xff0c;建立数据来源可确认、使用范围可界定、流通过程可追溯…

金融知识分享系列之:支撑阻力

金融知识分享系列之&#xff1a;支撑阻力 一、支撑阻力原理二、支撑阻力作用1.识别市场资金的预期2.作为入场和平仓的重要参考 三、寻找支撑阻力四、延伸思考五、支撑阻力总结 一、支撑阻力原理 支撑阻力核心要素&#xff1a; 锚定效应订单驱动 支撑阻力原理&#xff1a; 市…

在DevEco Studio中第一次使用网络图片不显示问题

当我们新建项目 第一次使用网络图片 没有显示时 加这段代码就可以了 如果刷新图片还是没有显示 就重启编辑器。 "requestPermissions": [{"name": "ohos.permission.INTERNET"}],

>>Vue3+pinia+echarts等实现疫情可视化大图

一.>>前言 1.这个项目是在小满实战篇可视化&#xff08;第九章-饼图&#xff09;_哔哩哔哩_bilibili 这一系列课程为基础来做的&#xff0c;真的很感谢小满老师&#xff0c;讲的内容干货满满&#xff0c;暂时解决了手上没有项目的难题。大家可以去观摩一下他的优质课程。…

WT32-ETH02 plus 串口转以太网开发,WT32-ETH01网关开发板升级款!

广受欢迎的WT32-ETH01网关开发板迎来了升级。 就是这款启明云端新推出的嵌入式串口转以太网开发板——WT32-ETH02 plus。应广大客户的需求&#xff0c;在WT32-ETH01的基础上增加了POE供电&#xff0c;可广泛应用于智能家居和网关等应用。开发板搭载2.4GHz Wi-Fi和蓝牙双模的SO…

PyTorch 深度学习(GPT 重译)(五)

十二、通过指标和增强改进训练 本章涵盖 定义和计算精确率、召回率以及真/假阳性/阴性 使用 F1 分数与其他质量指标 平衡和增强数据以减少过拟合 使用 TensorBoard 绘制质量指标图 上一章的结束让我们陷入了困境。虽然我们能够将深度学习项目的机制放置好&#xff0c;但实…

shell编程入门(笔记)

1、shell编程基础&#xff1a; 1.1、shell的解释执行功能 1.2、什么是shell程序&#xff1f; 1.3、shell程序编程的主要内容 1.4、shell程序的第一行 1.5、变量要求 1.6、环境变量和只读变量 1.7、位置参量 1.8、位置参量列表 1.9、数组 2、输入输出 2.1、输入-read命令 2.2…

Linux命令du详解

目录 du是什么&#xff1f;du 命令的格式常用的选项速查选项详解及例子du [目录/文件]-a-d-h-s-c--timeformatfull-isolong-isoiso -t 或 --thresholdSIZE --excludePATTERN--si-0 或--null--apparent-size-B size 或--block-sizesize-b 或--bytes-k-m-L 或 --dereference-l 或…

C++类和对象基础

目录 类的认识 访问限定符&#xff1a;public(公有)&#xff0c;protected(保护)&#xff0c;private(私有)。 类的两种定义方式: 类的实例化&#xff1a; 封装&#xff1a; 类的对象大小的计算&#xff1a; 类成员函数的this指针&#xff1a; C语言是面向过程的语言&am…

洛谷_P1605 迷宫_python写法

P1605 迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) dfs代码&#xff1a; 这道题也是简单的深搜问题&#xff0c;但是要注意地图的原点记得要初始化maps[sx-1][sy-1] 1 n, m, t map(int,input().split()) sx, sy, fx, fy map(int,input().split()) maps [[0 for _ i…

Java反射:深入解析与实战应用

在Java编程的世界中&#xff0c;反射机制是一种强大的工具&#xff0c;它允许程序在运行时检查和操作类、接口、字段和方法的信息。通过反射&#xff0c;我们可以实现许多高级功能&#xff0c;如动态代理、框架设计等。本文将深入探讨Java反射的基本概念、使用方法以及在实际项…

APP稳定性测试工具:Monkey

一、Monkey 简介 Monkey 是一款 app 的自动化测试工具&#xff0c;monkey 是猴子的意思&#xff0c;所以从原理上说&#xff0c;它的自动化测试就类似猴子一样在软件上乱敲按键&#xff0c;猴子什么都不懂&#xff0c;就爱捣乱。Monkey 原理也是类似&#xff0c;通过向系统发送…

多模态大语言模型的 (R) 演变:调查

目录 1. Introduction2. 赋予LLMs多模态能力2.1 大型语言模型2.2 视觉编码器2.3 视觉到语言适配器2.4 多模式训练 3. 使用 MLLM 处理视觉任务 连接文本和视觉模式在生成智能中起着至关重要的作用。因此&#xff0c;受大型语言模型成功的启发&#xff0c;大量研究工作致力于多模…

Jmeter接口测试步骤

一、使用工具测试 1、使用Jmeter对接口测试 首先我们说一下为什么用Posman测试后我们还要用Jmeter做接口测试&#xff0c;在用posman测试时候会发现的是一个接口一个接口的测试&#xff0c;我们每次测试成功后的数据&#xff0c;在工具中是无法保存的&#xff0c;再次测试的时…

STM32CubeMX学习笔记23---FreeRTOS(任务的挂起与恢复)

1、硬件设置 本实验通过freertos创建两个任务来分别控制LED2和LED3的亮灭&#xff0c;需要用到的硬件资源 LED2和LED3指示灯串口 2、STM32CubeMX设置 根据上一章的步骤创建两个任务&#xff1a;STM32CubeMX学习笔记22---FreeRTOS&#xff08;任务创建和删除&#xff09;-CS…

递归方法解决树的遍历问题

二叉树的最大深度 描述&#xff1a;给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 递归法&#xff08;自顶向下&#xff09; 通过递归法&#xff0c;左右子树同时向下递归遍历&#xff0c;直到遍…