数组入门:从零基础到排序算法 - 教程

news/2025/9/23 19:27:21/文章来源:https://www.cnblogs.com/lxjshuju/p/19107852
  1. 数组的概念
    1.1 什么是数组
    数组是由​​相同类型元素​​构成的集合,这些元素在​​内存中连续存储​​。定义一个数组相当于一次性定义了多个变量,这些变量具有相同的数据类型,并通过下标进行访问。

    数组的基本特性:

    • 数组中存放的是一个或多个数据,但元素个数不能为0

    • 数组中存放的多个数据,类型是相同的

    • 数组在内存中是连续存放的

    • 数组的大小在创建时确定,大小不可改变

    1.2 什么是数组元素
    构成数组的每一个数据称为​​数组元素​​。数组元素可以是基本数据类型(如int、double、char)也可以是引用类型(如对象)。

    1.3 什么是数组下标
    数组的下标是元素在数组中的​​位置索引​​,从0开始,依次累加1。下标的界限是:0 ~ 数组长度-1。

    如果访问数组时下标 <0 或 >数组长度-1,会抛出ArrayIndexOutOfBoundsException异常。

    1.4 什么是数组长度
    数组长度表示数组的大小,即数组元素的个数。获取数组长度的方法是:数组名.length。

    注意:数组的大小在分配内存时就已经确定,大小不可改变。

  2. 数组的声明和创建(以一维数组为例)
    2.1 定义数组
    // 数组名在前
    int arr1[];
    // 数组名在后
    int[] arr2;
    2.2 为数组元素分配内存空间

    // 一种方法
    int arr1[] = new int[5];
    // 另一种方法
    double[] arr2;
    arr2 = new double[4];
    new运算符用于为数组元素分配内存,数据类型必须相同。

    2.3 数组元素初始化

    // 第一种写法:动态初始化
    int arr1[] = new int[]{
    1, 2, 3, 4, 5
    };
    // int[]中括号内不可以写数组的大小
    // 第二种写法:静态初始化简化形式
    int arr2[] = {
    1, 2, 3
    };
    // 第三种写法:分步初始化
    double[] arr3;
    arr3 = new double[]{
    1.0, 2.1, 3.2, 4.4
    };
    // 第四种写法:逐个元素初始化
    char []ch4 = new char[4];
    ch4[0] = 'v';
    ch4[1] = 'h';
    ch4[2] = 'n';
    ch4[3] = 'm';
    // 这种写法数组的下标一定不能发生越界

    数组初始化时,如果没有给定初始值,数组元素会有其默认值:

    • 整型默认值为0

    • 浮点型默认值为0.0

    • 布尔型默认值为false

    • 引用类型默认值为null

    2.4 数组元素在内存中的表现形式
    当执行int[] score = new int[5]时:

    • score中存放的是一个引用类型的值(如0xAA01)

    • 这个值是一个指针,指向内存中首地址为0xAA01、长度为5的连续内存空间

    • 由于没有对数组元素初始化,所有元素使用默认值0

  3. 数组的使用
    3.1 找数组元素的最大(小)值,求总和,求平均

    public static void main(String[] args){
    int[] arr = new int[]{
    23, 34, 54, 13, 45
    };
    int max = arr[0];
    int min = arr[0];
    int sum = 0;
    for(int i = 1; i < arr.length; i++){
    if(max < arr[i]){
    max = arr[i];
    }
    if(min > arr[i]){
    min = arr[i];
    }
    sum += arr[i];
    }
    System.out.println("最大值为:" + max);
    System.out.println("最小值为:" + min);
    System.out.println("总和为:" + sum);
    System.out.println("平均值为:" + (double)sum/arr.length);
    }

    3.2 对数组排序
    3.2.1 冒泡排序

    public static void main(String[] args) {
    int score[] = new int[80000];
    Random random = new Random();
    for (int i = 0; i < score.length; i++) {
    score[i] = random.nextInt(80000);
    }
    long start = System.currentTimeMillis();
    // 冒泡排序
    for (int i = 0; i < score.length-1; i++) {
    for (int j = 0; j < score.length-i-1; j++) {
    if(score[j] > score[j+1]){
    int tmp = score[j];
    score[j] = score[j+1];
    score[j+1] = tmp;
    }
    }
    }
    long end = System.currentTimeMillis();
    System.out.println("耗时:" + (end-start) + "毫秒");
    }

    结果:80000个数使用冒泡排序大约用时8450毫秒

    3.2.2 选择排序

    public static void main(String[] args) {
    int[] arr = new int[80000];
    Random r = new Random();
    for (int i = 0; i < arr.length; i++) {
    arr[i] = r.nextInt(80000);
    }
    long start = System.currentTimeMillis();
    // 选择排序
    for (int i = 0; i < arr.length-1; i++) {
    int minIndex = i;
    int min = arr[i];
    for(int j = i+1; j < arr.length; j++){
    if (arr[j] < min){
    min = arr[j];
    minIndex = j;
    }
    }
    int tmp = arr[i];
    arr[i] = arr[minIndex];
    arr[minIndex] = tmp;
    }
    long end = System.currentTimeMillis();
    System.out.println("耗时:" + (end-start) + "毫秒");
    }

    结果:80000个数使用选择排序大约用时1800毫秒

    3.2.3 插入排序

    public static void main(String[] args) {
    int[] arr = new int[80000];
    for (int i = 0; i <
    80000; i++) {
    arr[i] = (int)(Math.random() * 80000);
    }
    long start = System.currentTimeMillis();
    // 插入排序
    for (int i = 1; i < arr.length; i++) {
    int j = i;
    while (j >
    0){
    if (arr[j] < arr[j-1]){
    int temp = arr[j];
    arr[j] = arr[j-1];
    arr[j-1] = temp;
    j--;
    } else {
    break;
    }
    }
    }
    long end = System.currentTimeMillis();
    System.out.println("耗时:" + (end-start) + "毫秒");
    }

    结果:80000个数使用插入排序大约用时700毫秒

    3.2.4 快速排序

    public static void main(String[] args){
    int[] arr = new int[80000];
    for (int i = 0; i <
    80000; i++) {
    arr[i] = (int)(Math.random() * 800000);
    }
    long s = System.currentTimeMillis();
    quickSort(arr, 0, arr.length-1);
    long e = System.currentTimeMillis();
    System.out.println("耗时:" + (e-s) + "毫秒");
    }
    public static void quickSort(int[] arr, int first, int last){
    if (first >= last) {
    return;
    }
    int low = first;
    int high = last;
    int mid_value = arr[first];
    while (low < high){
    while (low < high && arr[high] >= mid_value){
    high -= 1;
    }
    arr[low] = arr[high];
    while (low < high && arr[low] < mid_value){
    low += 1;
    }
    arr[high] = arr[low];
    }
    arr[high] = mid_value;
    quickSort(arr, first, low-1);
    quickSort(arr, low+1, last);
    }

    结果:80000个数使用快速排序大约用时20毫秒

  4. Arrays类
    4.1 什么是Arrays类
    Arrays类是Java提供的数组工具类(java.util.Arrays),包含各种操作数组的静态方法。由于数组本身没有提供很多操作方法,Arrays类填补了这一空白。
    4.2 常用方法
    4.2.1 查找数组元素:binarySearch方法

    public static void main(String[] args){
    int[] arr = new int[] {
    10, 50, 40, 30
    };
    Arrays.sort(arr);
    // 排序后:10, 30, 40, 50
    int index = Arrays.binarySearch(arr, 10);
    System.out.println(index);
    // 0
    index = Arrays.binarySearch(arr, 0);
    System.out.println(index);
    // -1
    index = Arrays.binarySearch(arr, 45);
    System.out.println(index);
    // -4
    index = Arrays.binarySearch(arr, 90);
    System.out.println(index);
    // -5
    }

    binarySearch方法使用二分查找算法,前提是数组必须已排序。

    4.2.2 数组转字符串:Arrays.toString(array)

    public static void main(String[] args){
    int[] arr1 = {
    10, 50, 40, 30, 89, 67, 4, 678
    };
    Arrays.sort(arr1);
    System.out.println(Arrays.toString(arr1));
    // 输出:[4, 10, 30, 40, 50, 67, 89, 678]
    }

    4.2.3 填充数组:Arrays.fill(array, val)

    public static void main(String[] args){
    int[] arr1 = {
    10, 50, 40, 30, 89, 67, 4, 678
    };
    Arrays.fill(arr1, 30);
    System.out.println(Arrays.toString(arr1));
    // 输出:[30, 30, 30, 30, 30, 30, 30, 30]
    }

    4.2.4 数组的比较:Arrays.equals(array1, array2)

    public static void main(String[] args) {
    int[] arr1 = {
    10, 50, 40, 30
    };
    int[] arr2 = {
    10, 50, 40, 30
    };
    int[] arr3 = {
    60, 50, 85
    };
    System.out.println(Arrays.equals(arr1, arr2));
    // true
    System.out.println(Arrays.equals(arr1, arr3));
    // false
    }

    4.2.5 数组的排序:Arrays.sort(array)
    // 数组全部排序

    public static void main(String[] args){
    int[] arr1 = {
    10, 50, 40, 30
    };
    Arrays.sort(arr1);
    System.out.println(Arrays.toString(arr1));
    // 输出:[10, 30, 40, 50]
    }
    // 指定范围排序
    public static void main(String[] args){
    int[] arr1 = {
    10, 50, 40, 30, 89, 67, 4, 678
    };
    Arrays.sort(arr1, 3, arr1.length-1);
    System.out.println(Arrays.toString(arr1));
    // 输出:[10, 50, 40, 4, 30, 67, 89, 678]
    }

    4.2.6 数组的复制:Arrays.copyOf(array, length)

    public static void main(String[] args){
    int[] arr1 = new int[] {
    10, 50, 40, 30
    };
    // 将arr1复制成长度为3的新数组arr2
    int[] arr2 = Arrays.copyOf(arr1, 3);
    System.out.println(Arrays.toString(arr2));
    // [10, 50, 40]
    }
  5. 多维数组(以二维数组为例)
    5.1 定义数组
    // 数组名在前

    int arr1[][];

    // 数组名在后

    int[][] arr2;

    5.2 为数组元素分配内存空间
    // 一种方法

    int arr1[][] = new int[5][4];

    // 另一种方法

    double[][] arr2;
    arr2 = new double[5][4];

    多维数组是"数组的数组",二维数组是最常见的多维数组,可以理解为表格或矩阵。

    5.3 数组元素初始化

    // 第一种写法
    int arr1[][] = new int[][] {
    {1, 5},
    {2, 4, 2},
    {3, 7, 9, 5}
    };
    // 第二种写法
    int arr2[][] = {
    {1, 5},
    {2, 4, 2},
    {3, 7, 9, 5}
    };
    // 第三种写法
    double[][] arr3;
    arr3 = new double[][] {
    {1.0, 5.1},
    {2.2, 4.3, 2.4},
    {3.5, 7.6, 9.7, 5.8}
    };
    // 第四种写法:逐个元素初始化
    char[][] ch4 = new char[3][2];
    ch4[0][0] = 'v';
    ch4[0][1] = 'h';
    // ...
    ch4[2][0] = 'h';
    ch4[2][1] = 'm';

    注意:Java中的多维数组实际上是"不规则数组",每个子数组的长度可以不同。

    5.4 多维数组的应用场景
    多维数组常用于以下场景:

    • 图像处理(像素矩阵)
    • 游戏开发(地图、棋盘)
    • 数学计算(矩阵运算)
    • 数据分析(表格数据)
    • 科学计算(三维坐标)

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

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

相关文章

国家摄影网站广州谷歌推广

欢迎来到MindGraph&#xff0c;这是一个概念验证、开源的、以API为先的基于图形的项目&#xff0c;旨在通过自然语言的交互&#xff08;输入和输出&#xff09;来构建和定制CRM解决方案。该原型旨在便于集成和扩展。以下是关于X的公告&#xff0c;提供更多背景信息。开始之前&a…

server2008 做网站最牛的科技网站建设

我们在使用电脑浏览网页的时候有可能会想截取整篇网页&#xff0c;由于页面在电脑上显示不全&#xff0c;阅读的时候都需要滚动条来看&#xff0c;直接截屏根本截不全整个网页&#xff0c;这时候就需要截取网页的长截图了&#xff0c;那么怎么使用浏览器截长图呢? 1、以Edge浏…

河南网站seo推广湖南网站建设方案优化

PHP版本的AI电话机器人系统具有以下优势&#xff1a; 提升客户体验&#xff1a;AI电话机器人能够为客户提供724小时的服务&#xff0c;无论何时客户有疑问或需要帮助&#xff0c;都可以得到及时响应1。 提高工作效率和客户满意度&#xff1a;AI电话机器人系统具有智能回答问题…

织梦网站模板套用做铝板的网站

在做性能测试过程中有一件很重要的事情需要去完成&#xff0c;那就是分析性能指标数据&#xff0c;可以这样说做性能测试的整个过程都跟指标数据息息相关&#xff0c;下面来说一下常见的一些性能指标数据&#xff1a; 1.吞吐量 2.并发数 3.思考时间 4.响应时间 5.点击数 …

h5 响应式手机网站网络推广应该怎么做啊

全套笔记资料代码移步&#xff1a; 前往gitee仓库查看 感兴趣的小伙伴可以自取哦&#xff0c;欢迎大家点赞转发~ 全套教程部分目录&#xff1a; 部分文件图片&#xff1a; 认识Vue3 1. Vue3组合式API体验 通过 Counter 案例 体验Vue3新引入的组合式API vue <script> ex…

网站建设案例渠道微信推广营销

调度约束 Kubernetes 是通过 List-Watch **** 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 Pod 和 Container。…

汉源网站建设网站的经典推广方法

1、oracle导出dmp文件的时候&#xff0c;经常会出现一些空表&#xff0c;没有一并被导出的情况。 执行sql select alter table ||table_name|| allocate extent; from user_tables where num_rows0 or num_rows is null; 新建一个sql窗口&#xff0c;把查询结果的sql&#…

用C/C++重构PowerShell:全面绕过安全机制的技术解析

本文详细介绍了如何通过C/C++原生代码实例化完整的PowerShell控制台,并系统性地绕过AMSI、脚本日志记录、转录功能、执行策略和约束语言模式等安全机制。文章包含具体的技术实现代码和内存补丁方法,展示了从CLR初始化…

珠江网站建设学风网站建设

目录 盒子模型块级盒子内联级盒子内联块级盒子弹性盒子display 改变模型区域划分text 内容区padding 填充区border 边框区margin 外边距直接设置盒子大小 布局横向布局方法一 float 浮起来方法二 内联块级元素实现方法三 弹性盒子模型 盒子模型 块级盒子 独占一行&#xff0c…

Optuna v4.5新特性深度解析:GPSampler实现约束多目标优化

Optuna在8月18日发布了最近的 v4.5版,加入了GPSampler的约束多目标优化功能,我们来看看这个新的功能。 基于高斯过程的贝叶斯优化(GPBO)最近几年在材料科学、机器学习等领域应用很广。GPSampler最初设计时就想做一…

题解:P4769 [NOI2018] 冒泡排序

题意:定义一个排列是好的,当且仅当可以通过 \(\frac 1 2\sum_{i=1}^n|i-p_i|\) 次对相邻两个数的交换使得整个排列变成 \(1,2,\cdots n\)。给出一个排列 \(q\),求有多少个排列 \(p\) 满足他是好的且字典序大于 \(q\…

电商网站零售客户丰县建设局规划局网站

目录 安装Pyecharts 安装对应的地图拓展&#xff1a; 准备数据 使用 pyecharts 模块中的 Geo 函数&#xff1a; 使用 pyecharts 模块中的 map 函数&#xff1a; 把一些地域性比较明显的数据显示在一张地图上&#xff0c;远比给别人一个 Excel 文件好得多。 Matplotlib 中…

做宣传图片用什么网站阿里巴巴网站建设的背景

1. 简介 介绍 Kafka 的概述、优势和劣势&#xff0c;以及应用场景。 2. 基本概念 2.1 架构 一个典型的 Kafka 体系架构包括若干 Producer、若干Broker、若干 Consumer&#xff0c;以及一个ZooKeeper集群。 ZooKeeper是Kafka用来负责集群元数据的管理、控制器的选举等操作的…

懒人学做网站箱包网站建设策划报告

本文播放器家园网给大家整理了如何禁止爱奇艺视频方面的内容。爱奇艺pc端和手机端都支持通过频道推荐、观看历史、加入看单、搜索功能快速找到想看的视频。 WFilter有自带的常用协议特征库&#xff0c;可以通过禁止“爱奇艺视频”的协议来禁止爱奇艺视频。步骤如下 1、1.打开…

网站域名有了_网站如何建设建设淘宝网站的意义

利用共享缓存和操作系统缓存利用 RAM Postgres 是一个基于磁盘的数据库&#xff0c;即使您的整个架构是围绕磁盘访问设计的&#xff0c;利用 RAM 也很重要。如果按照人类规模的延迟来判断&#xff0c;这可以将延迟从几天缩短到几分钟&#xff08;图 1&#xff09;。只需看一下…

长沙网站建设接单WordPress广告防屏蔽

打开apache-tomcat-6.0.32/bing/catalina.bat在首行添加&#xff1a; set JAVA_HOMEC:\Program Files\Java\jdk1.6.0_07 就可以了。

厦门网站建设哪家不错推荐怎么用wordpress做模板

在当今的数字化浪潮中&#xff0c;企业对数据的渴求与日俱增。数据不再仅是辅助决策的工具&#xff0c;而是成为推动业务增长的核心动力。自从「数据中台」概念降温后&#xff0c;企业纷纷探寻新的数智化路径。在这个过程中&#xff0c;「数据飞轮」作为一种新兴的理念&#xf…

网站想做个链接怎么做asp.net 3.5网站开发全程解析

目录 引言 Redis GEO命令概述 什么是GEO命令&#xff1f; 主要命令详解 命令应用示例 添加地点信息 查询两地距离 查询附近的城市 实现"查找附近的人"功能 功能需求与实现思路 基本需求 实现思路 命令实现方案 存储用户位置 查询附近的用户 Java代码实…

成品网站nike源码1688旅游宣传网站建设方案

线程简介 在 Java 中&#xff0c;并发机制非常重要。在以往的程序设计中&#xff0c;我们都是一个任务完成后再进行下一个任务&#xff0c;这样下一个任务的开始必须等待前一个任务的结束。Java 语言提供了并发机制&#xff0c;程序员可以在程序中执行多个线程&#xff0c;每一…

详细介绍:内网后渗透攻击--域控制器安全(1)

详细介绍:内网后渗透攻击--域控制器安全(1)2025-09-23 19:12 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: …