Java学习笔记(五)数组、冒泡排序

news2024/12/25 9:05:27

Hi i,m JinXiang


⭐ 前言 ⭐

本篇文章主要介绍Java数组、冒泡排序使用以及部分理论知识


🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁

🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言


目录

一、数组

数组介绍

数组的使用

1.1、动态初始化

数组的定义

1.2、动态初始化

1.3、静态初始化

数组使用注意事项和细节

代码示例--错误释放

数组赋值机制

数组拷贝

数组拷贝介绍

代码示例拷贝过程

结果展示

数组反转

代码示例内容反转过程

图片介绍操作

结果展示

数组扩容

扩容介绍

代码示例扩容

代码图片解释

结果展示

数组缩减

二、排序介绍

内部排序

外部排序

三、冒泡排序法

冒泡排序介绍

冒泡排序案例

冒泡排序代码诠释

四、查找

1、顺序查找

案例演示:

结果:

2、二分查找

五、二维数组

什么是二维数组?

二维数组的使用

1、动态初始化

2、动态初始化

3、动态初始化-列数不确定

4、静态初始化

二维数组的应用

杨辉三角练习

二维数组使用细节和注意事项


一、数组

数组介绍

  • 数组可以存放多个同一类型的数据。
  • 数组也是一种数据类型,是引用类型。
  • 即:数组就是一组数据
     

数组的使用

1.1、动态初始化

数组的定义

数据类型 数组名[] = new 数据类型【大小】

int a[]=new int[5];

//创建了一个数组,名字a,存放5个int
说明:这是定义数组的一种方法。


1.2、动态初始化

  • 1、先声明数组
    • 语法:数据类型数组名[];也可以数据类型[]数组名;
    • inta[];或者int[]a;
  • 2、创建数组
    • 语法:数组名=new数据类型[大小];
    • a=newint[10];

1.3、静态初始化

  • 1、初始化数组
    • 语法:数据类型  数组名[] =  (元素值 , 元素值..}
       
  • int a[]={2,5,6,7,8,89,90,34,56},如果知道数组有多少元素,具体值上面的
    • 用法相当于: int a[] =new int[9];
      • a[0]= 2;a[1]=5;a[2]=6; a[3]=7;a[4]=8; 
      • a[5]=89;a[6] =90;a[7]=34;a[8]=56;

数组使用注意事项和细节

  • 1)数组是多个相同类型数据的组合,实现对这些数据的统一管理
  • 2)数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。
  • 3)数组创建后,如果没有赋值,有默认值
    • int0,short0,byte0,long0,float0.0,double0.0,char\u0000,booleanfalse,Stringnull
  • 4)使用数组的步骤1.声明数组并开辟空间2给数组各个元素赋值3使用数组
  • 5)数组的下标是从0开始的
  • 6)数组下标必须在指定范围内使用,否则报:下标越界异常,比如
    • int[]arr=newint[5];则有效下标为0-4
  • 7)数组属引用类型,数组型数据是对象(object)

代码示例--错误释放

package com.example.han_severejava.XunHuan;

public class 数组 {
    public static void main(String[] args) {
        //1.数组是多个相同类型数据的组合,实现对这些数据的统一管理
        //int[]arr1={1,2,3,60,"hello"};//String->int
        double[]arr2={1.1,2.2,3.3,60.6,100};//int->double

        //2.数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用
        String[]arr3={"北京","jack","milan"};

        //3.数组创建后,如果没有赋值,有默认值
        //int   0,short0,byte0,long0,
        //float0.0,double0.0,char\u0000,
        //booleanfalse,Stringnull
        short[]arr4=new short[3];
        System.out.println("=====数组arr4=====");
        for(int i=0;i<arr4.length;i++){
            System.out.println(arr4[i]);
        }

        //6.数组下标必须在指定范围内使用,否则报:下标越界异常,比如
        // int[]arr=newint[5];则有效下标为0-4
        //即数组的下标/索引最小0最大数组长度-1(4)
        int[]arr=new int[5];
        System.out.println(arr[5]);//数组越界
    }
}

数组赋值机制

  • 1、基本数据类型赋值,这个值就是具体的数据,而且相互不影响。
    • int n1 = 2;
    • int n2 = n1;
  • 2、数组在默认情况下是引用传递,赋的值是地址。
  • 看一个案例,并分析数组赋值的内存图(重点,难点.)
int[]arr1={1,2,3};
int[]arr2=arr1;

数组拷贝

数组拷贝介绍

int[]arr1={10,20,30}; 拷贝到 arr2 数组 , 要求数据空间是独立的

代码示例拷贝过程

package com.example.han_severejava.XunHuan;

public class 数组拷贝 {
    public static void main(String[] args) {
        //将int[]arr1={10,20,30};拷贝到arr2数组,
        //要求数据空间是独立的.
        int[]arr1={10,20,30};
        //创建一个新的数组arr2,开辟新的数据空间
        //大小arr1.length;
        int[] arr2=new int[arr1.length];
        //遍历arr1,把每个元素拷贝到arr2对应的元素位置
        for(int i=0;i<arr1.length;i++){
            arr2[i]=arr1[i];
        }
        //老师修改arr2,不会对arr1有影响.
        arr2[0]=100;
        //输出arr1
        System.out.println("====arr1的元素====");
        for(int i=0;i<arr1.length;i++) {
            System.out.println(arr1[i]);//10,20,30
        }

        //输出arr2
        System.out.println("====arr2的元素====");
        for(int i=0;i<arr2.length;i++) {
            System.out.println(arr2[i]);//
        }
    }
}

结果展示

数组反转

要求:把数组的元素内容反转。
arr{11,22,33,44,55,66}    {66,55,44,33,22,11}

代码示例内容反转过程

package com.example.han_severejava.XunHuan;

public class 数组反转 {
    public static void main(String[] args) {
        //定义数组
        int[]arr={11,22,33,44,55,66};
        //规律
        //1.把arr[0]和arr[5]进行交换{66,22,33,44,55,11}
        //2.把arr[1]和arr[4]进行交换{66,55,33,44,22,11}
        //3.把arr[2]和arr[3]进行交换{66,55,44,33,22,11}
        //4.一共要交换3次=arr.length/2
        //5.每次交换时,对应的下标是arr[i]和arr[arr.length-1-i]//代码
        //优化
        int temp=0;
        int len=arr.length;//计算数组的长度
        for(int i=0;i<len/2;i++){
            temp=arr[len-1-i];//保存
            arr[len-1-i]=arr[i];
            arr[i]=temp;
        }
        System.out.println("===翻转后数组===");
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+"\t");//66,55,44,33,22,11
        }
    }
}

图片介绍操作

另一种方法----看图诠释

结果展示

数组扩容

扩容介绍

要求:实现动态的给数组添加元素效果,实现对数组扩容
  • 1、原始数组使用静态分配int[]arr={1,2,3}
  • 2、增加的元素4,直接放在数组的最后arr={1,2,3,4}
  • 3、用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n

代码示例扩容

package com.example.han_severejava.XunHuan;

import java.util.Scanner;

public class 数组扩容 {
    public static void main(String[] args) {
        /*
        要求:实现动态的给数组添加元素效果,实现对数组扩容。ArrayAdd.java
        1.原始数组使用静态分配int[]arr={1,2,3}
        2.增加的元素4,直接放在数组的最后arr={1,2,3,4}
        3.用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n

        思路分析
        1.定义初始数组int[]arr={1,2,3}//下标0-2
        2.定义一个新的数组int[]arrNew=newint[arr.length+1];
        3.遍历arr数组,依次将arr的元素拷贝到arrNew数组
        4.将4赋给arrNew[arrNew.length-1]=4;把4赋给arrNew最后一个元素
        5.让arr指向arrNew;arr=arrNew;那么原来arr数组就被销毁
        6.创建一个Scanner可以接受用户输入
        7.因为用户什么时候退出,不确定,老师使用do-while+break来控制
        */

        Scanner myScanner=new Scanner(System.in);//初始化数组
        int[]arr={1,2,3};
        do {
            int[] arrNew = new int[arr.length + 1];
            //遍历arr数组,依次将arr的元素拷贝到arrNew数组
            for (int i = 0; i < arr.length; i++) {
                arrNew[i] = arr[i];
            }
            System.out.println("请输入你要添加的元素");
            int addNum = myScanner.nextInt();
            //把addNum赋给arrNew最后一个元素
            arrNew[arrNew.length - 1] = addNum;
            //让arr指向arrNew,
            arr = arrNew;
            //输出arr看看效果
            System.out.println("====arr扩容后元素情况====");
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + "\t");
            }
            System.out.println("是否继续添加(y/n)");
            char key = myScanner.next().charAt(0);
            if (key == 'n') {//如果输入n,就结束
                break;
            }
            //问用户是否继续
        } while (true);
    }
}

代码图片解释

结果展示

数组缩减

  • 有一个数组{12345},可以将该数组进行缩减,
  • 提示用户是否继续缩减,每次缩减最后那个元素。
  • 当只剩下最后一个元素,提示,不能再缩减。

二、排序介绍

排序是将多个数据,依指定的顺序进行排列的过程。

内部排序

指将需要处理的所有数据都加载到内部存储器中进行排序。包括 ( 交换式排序法、选择
式排序法和插入式排序法 )

外部排序

数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括 ( 合并排序法和直接合并排序法 )

三、冒泡排序法

冒泡排序介绍

冒泡排序( BubbleSorting )的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。

冒泡排序案例

冒泡排序代码诠释

四、查找

1、顺序查找

案例演示:

1)有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】要求 : 如果找到了,就提示找到,并给出下标值。
package com.example.han_severejava.查找;

import java.util.List;
import java.util.Scanner;

public class 顺序查找 {
    public static void main(String[] args) {
        //1)有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:从键盘中任意输入一个名称,
        // 判断数列中是否包含此名称【顺序查找】
        // 要求:如果找到了,就提示找到,并给出下标值。
        String names[] = {"白眉鹰王","金毛狮王","紫衫龙王","青翼蝠王"};
        Scanner input = new Scanner(System.in);
        System.out.println("请输入一个名称:");
        String findName = input.next();

        int index = -1;
        for (int i = 0; i < names.length; i++) {
            if (findName.equals(names[i])) {
                System.out.println("已找到"+findName+",当前下标是:"+i);
                index = i;
                break;
            }
        }
        if (index == -1){
            System.out.println("未找到"+findName);
        }
    }
}

结果:

2、二分查找


五、二维数组

什么是二维数组?

  • 1. 从定义形式,上看int[][ ]
  • 2. 可以这样理解,原来的一维数组的每个元素是一维数组,就构成二维数组
package com.example.han_severejava.二维数组;

public class 什么是二维数组 {
    public static void main(String[] args) {
        //二维数组的格式   数组类型 [][] 数组名称 = {{},{},{}}
        int [][] arr = {
            {0, 0, 0, 0, 0, 0},
            {0, 0, 1, 0, 0, 0},
            {0, 2, 0, 3, 0, 0},
            {0, 0, 0, 0, 0, 0}
        };

        //关于一维数组的关键概念
        //(1)
        System.out.println("二维数组的元素个数="+ arr.length) ;
        //(2)二维数组的每个元素是一维数组,所以如果需要得到每个一维数组的值,还需要再次逼历
        //(3) 如果我们要访问第(i+1)个一维数组的第j+1个值 arr[i][j];
        //    举例访问3, =》他是第3个一维数组的第4个值arr[2][3]
                System.out.println("第3个一维数组的第4个值="+ arr[2][3]); //3


                        //输出二维数组
        for (int i = 0; i < arr.length; i++) {//遍历二维数组的每个元素

            //arr[i] 表示 二维数组的第i+1个元素  比如arr[0]:二维数组的第一个元素
            //arr[i].length 得到对应的 每一个一维数组的长度


            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j]+" ");//输出一维数组
            }
            System.out.println();//换行
        }
    }
}

二维数组的使用

1、动态初始化

  • 1)语法:类型[] []数组名=new类型[大小][大小]
  • 2)比如: int a[]I[]=new int[2][3]
  • 3)使用演示
  • 4)二维数组在内存的存在形式 ↓

package com.example.han_severejava.二维数组;

public class 二维数组的内存布局 {
    public static void main(String[] args) {
        int arr[][] = new int[2][3]; //一个二维数组

        //给他赋值(从0开始)
        arr[1][2] = 8;//”[1]“表示在第二个数组中  “[2]”表示第三个数据

        //遍历数组
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) { //对每个一维数组遍历
                System.out.print(arr[i][j]+" ");
            }
            System.out.println(); //换行
        }
    }
}

2、动态初始化

  • 1)先声明:类型 数组名[] [];
  • 2)再定义(开辟空间) 数组名 = new 类型 [大小][大小]
  • 3)赋值(有默认值,比如int 类型的就是0)
  • 4)使用演示

3、动态初始化-列数不确定

  • 1)看一个需求:动态创建下面二维数组,并输出。
  • 如:

4、静态初始化

  • 定义类型数组名[[] = {{值1,值2..},{值1,值2..},{值1,值2..}}
  • 2.使用即可[固定方式访问]
     

二维数组的应用

杨辉三角练习

package com.example.han_severejava.二维数组;

public class 杨辉三角 {
    public static void main(String[] args) {
        int[][] yangHui = new int[10][];
        for (int i = 0; i < yangHui.length; i++) {
            //给每个一维数组(行)开空间
            yangHui[i] = new int[i + 1];
            //给每一个一维数组(行)赋值
            for (int j = 0; j < yangHui[i].length; j++) {
                //每一行的第一个元素和最后一个元素都是1
                if (j==0 || j==yangHui[i].length -1){
                    yangHui[i][j] = 1;
                }else {//中间的元素
                    yangHui[i][j] = yangHui[i - 1][j] + yangHui[i - 1][j - 1];
                }
            }
        }
        //输出杨辉三角
        for (int i = 0; i < yangHui.length; i++) {
            for (int j = 0; j < yangHui[i].length; j++) {
                System.out.print(yangHui[i][j] + " ");
            }
            System.out.println();
        }
    }
}

二维数组使用细节和注意事项
 

总结不易,希望宝宝们不要吝啬亲爱的👍哟(^U^)ノ~YO!如有问题,欢迎评论区批评指正😁

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

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

相关文章

力扣SQL50 指定日期的产品价格 双重子查询 coalesce

Problem: 1164. 指定日期的产品价格 coalesce 的使用 简洁版 &#x1f468;‍&#x1f3eb; 参考题解 select distinct p1.product_id,coalesce((select p2.new_pricefrom Products p2where p2.product_id p1.product_id and p2.change_date < 2019-08-16order by p2.…

Web前端Promise

Promise介绍与使用 Promise是什么&#xff1f; 1.抽象表达&#xff1a; Promise是一门新的技术&#xff08;ES6规范&#xff09;Promise是JS中进行异步编程的新解决方案备注&#xff1a;旧方案是单纯使用回调函数 2.具体表达&#xff1a; 从语法上来说&#xff1a;Promise…

xmind--如何快速将Excel表中多列数据,复制到XMind分成多级主题

每次要将表格中的数据分成多级时&#xff0c;只能复制粘贴吗 快来试试这个简易的方法吧 这个是原始的表格&#xff0c;分成了4级 步骤&#xff1a; 1、我们可以先按照这个层级设置下空列&#xff08;后买你会用到这个空列&#xff09; 二级不用加、三级前面加一列、四级前面加…

前端:Vue学习 - 购物车项目

前端&#xff1a;Vue学习 - 购物车项目 1. json-server&#xff0c;生成后端接口2. 购物车项目 - 实现效果3. 参考代码 - Vuex 1. json-server&#xff0c;生成后端接口 全局安装json-server&#xff0c;json-server官网为&#xff1a;json-server npm install json-server -…

C++ 设计模式(五)——状态模式

状态模式 序言理解源码 序言 设计模式只是一个抽象的设计模式方法&#xff0c;并不是一个固定使用的搭配&#xff0c;就算是普通switch语句&#xff0c;Map&#xff0c;乃至状态机都是状态模式的其中一种实现方法 状态模式看起来好像和策略模式差不多&#xff0c;主要是其的侧…

JavaScript构造函数小挑战

// 编码挑战 #1 /* 使用构造函数实现一辆汽车。一辆汽车有一个品牌和一个速度属性。speed 属性是汽车当前的速度&#xff0c;单位为 km/h&#xff1b; a. 执行一个 “accelerate ”方法&#xff0c;将汽车的速度提高 10&#xff0c;并将新速度记录到控制台&#xff1b; 3. a.…

若依Vue前后端分离版如何部署(windows)(超详细)

一、项目环境准备 下面是项目所需要准备的环境 Node.js redis 1、Node.js下载 下面进入官网可以下载Node.js — 在任何地方运行 JavaScript (nodejs.org)https://nodejs.org/zh-cn 下载完成安装后&#xff0c;需要配置环境变量&#xff0c;首先复制以下nodejs的安…

商汤提出的BRECQ量化框架是个什么?

商汤提出的BRECQ量化框架是个什么&#xff1f; 引言 近年来&#xff0c;深度学习在多个领域取得了显著进展&#xff0c;但其巨大的计算成本和内存占用问题逐渐凸显。为了压缩和加速已训练好的网络&#xff0c;量化成为了一种重要的技术手段。量化主要分为两类&#xff1a;量化…

DAMA学习笔记(七)-数据集成和互操作

1.引言 数据集成和互操作(DII)描述了数据在不同数据存储、应用程序和组织这三者内部和之间进行移动和整合的相关过程。数据集成是将数据整合成物理的或虚拟的一致格式。数据互操作是多个系统之间进行通信的能力。数据集成和互操作的解决方案提供了大多数组织所依赖的基本数据管…

数据库解析一维和二维简易JSON,

项目还在使用Oracle11&#xff0c;不支持后续官方的json解析方式&#xff0c; 在 前年、去年、今年 接连 遇到json解析问题后&#xff08;其实是公司的轮子效率太慢&#xff0c;太复杂&#xff0c;决定自己造个轮子&#xff0c;看看到底为什么慢&#xff0c;是不是真的很复杂&a…

计算机网络八股文(四)

目录 61.客户端调用close()后的断开流程是怎样的&#xff1f; 62.没有accept可以建立TCP连接吗&#xff1f; 63.没有listen可以建立TCP连接吗&#xff1f; 64.什么是TCP半连接队列&#xff08;SYN队列&#xff09;和全连接队列&#xff08;accept队列&#xff09;&#xff…

质量问题到底是谁的责任?

在竞争日益激烈的市场环境中&#xff0c;产品质量是企业生存与发展的基石。每当谈及生产企业的质量问题&#xff0c;我们往往不由自主地思考&#xff1a;在这一复杂而精细的生产链条中&#xff0c;究竟是谁该为质量问题负责&#xff1f; 必须明确一个无可争议的事实&#xff1…

MySQL多实例的配置

步骤1 环境准备 安装多实例数据库 1&#xff09;安装好数据库mariadb yum -y install mariadb-server 2&#xff09;创建mysql多实例数据文件目录 mkdir /data/mysql/3307/{data,etc,socket,log,bin,pid} -pv mkdir /data/mysql/3308/{data,etc,socket,log,bin,pid} –pv ch…

51单片机15(直流电机实验)

一、序言&#xff1a;我们知道在单片机当中&#xff0c;直流电机的控制也是非常多的&#xff0c;所以有必要了解一些这个电机相关的一些知识&#xff0c;以及如何使用单片机来控制这个电机&#xff0c;那么在没有学习PWM之前&#xff0c;我们先简单的使用GPIO这个管脚来控制电机…

【MySQL】Ubuntu22.04 安装 MySQL8 数据库详解

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》《MySQL》《Qt》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 一、安装目录 1.1 更新软件源 sheepAron:/root$ sudo apt update1.2 安装mysql_ser…

手持式气象监测设备

手持式气象监测设备以其小巧轻便、功能齐全的特点&#xff0c;逐渐成为了现代气象观测的便携新选择。 一、手持式气象监测设备的优势 手持式气象监测设备最大的优势在于其便携性。相比传统的气象监测站&#xff0c;手持式气象监测设备体积小巧、重量轻&#xff0c;用户可以轻松…

聊一聊 Node.js V22.5 有啥重要更新

大家好&#xff0c;今天我们来聊聊 Node.js 最新发布的 V22.5 版本。作为一名开发者&#xff0c;每次看到新的版本更新&#xff0c;总是让人期待不已。V22.5 中新增了许多强大且实用的功能&#xff0c;让我们的开发工作更加高效便捷。在这篇文章中&#xff0c;我们将重点讨论以…

压测实操--kafka-consumer压测方案

作者&#xff1a;九月 环境信息&#xff1a; 操作系统centos7.9&#xff0c;kafka版本为hdp集群中的2.0版本。 Consumer相关参数 使用Kafka自带的kafka-consumer-perf-test.sh脚本进行压测&#xff0c;该脚本参数为&#xff1a; thread&#xff1a;测试时的单机线程数&…

心率血氧传感器 - 从零开始认识各种传感器【第十三期】

1、什么是心率血氧传感器 心率传感器是一种用于测量人体心跳频率的设备或传感器。由于脉搏或者心率是生命体征的重要参数之一&#xff0c;所以心率测量是目前可穿戴产品必备的一个测量和健康监控功能。 而血氧传感器是一种用于测量人体血液中氧气饱和度的设备或传感器。血氧饱…

c# 端口监控 Helper 以及写一个端口监控工具

c# 端口监控 Helper 以及写一个端口监控工具 介绍核心代码&#xff1a;工具完整编码&#xff1a;1、编写界面2、打开定时控件的属性设置。3、编写定时控件的 Tick 事件结果&#xff08;运行效果&#xff09; 介绍 由于最近做上架比较多&#xff0c;会经常来确保服务器的服务&a…