一起初学java,笔记记录的第五天:数组、排序和查找

一起初学java,笔记记录的第五天:数组、排序和查找

适用于初学java者

这个首先指出本文中图片和资源来自**韩顺平**老师,感谢老师做的无私奉献的教学!

1. 数组介绍

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

例:double[] hens = {3, 5, 1, 3.4, 2, 50, 7.8, 88.8,1.1,5.6,100};

2.数组使用

在这里插入图片描述

2.1动态初始化

先声明数组
语法:数据类型 数组名[];
也可以 数据类型[] 数组名;
int a[]; 或者 int[] a;

创建数组
语法: 数组名=new 数据类型[大小];
a=new int[10];

2.2静态初始化

在这里插入图片描述

2.3初始化注意事项

  1. 数组是多个相同类型数据的组合,实现对这些数据的统一管理
  2. 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。
  3. 数组创建后,如果没有赋值,有默认值 int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false,String null
  4. 使用数组的步骤 1. 声明数组并开辟空间 2 给数组各个元素赋值 3 使用数组
  5. 数组的下标是从 0 开始的。
  6. 数组下标必须在指定范围内使用,否则报:下标越界异常,
  7. 数组属引用类型,数组型数据是对象(object)

3.数组赋值机制

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

在这里插入图片描述

4.数组拷贝

编写代码 实现数组拷贝(内容复制) ArrayCopy.java 将 int[] arr1 = {10,20,30}; 拷贝到 arr2 数组, 要求数据空间是独立的.

//编写一个 main 方法 
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 
	 }
	 System.out.println("====arr2 的元素===="); 
	 for(int i = 0; i < arr2.length; i++) { 
	 	System.out.println(arr2[i]);
	 } 
}

5.数组反转

参考上面代码。自己完成。

6.数组添加/扩容

要求:实现动态的给数组添加元素效果,实现对数组扩容。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 = new int[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 来控制

7.排序的介绍

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

7.1内部排序:

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

7.2外部排序:

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

7.3冒泡排序法

在这里插入图片描述

//核心代码
for( int i = 0; i < arr.length - 1; i++) {
//外层循环是 4 次 
	for( int j = 0; j < arr.length - 1 - i; j++) {
	//4 次比较-3 次-2 次-1 次 
	//如果前面的数>后面的数,就交换 
		if(arr[j] > arr[j + 1]) { 
			temp = arr[j]; 
			arr[j] = arr[j+1]; 
			arr[j+1] = temp; 
		} 
	}

7.4查找

在 java 中,我们常用的查找有两种:

  1. 顺序查找 SeqSearch.java
  2. 二分查找【二分法,我们放在算法讲解】
    代码演示:
import java.util.Scanner; 
public class SeqSearch { 
//编写一个 main 方法 
	public static void main(String[] args) {
	/*有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏: 
	从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】 
	要求: 如果找到了,就提示找到,并给出下标值 
	思路分析 
	1. 定义一个字符串数组 
	2. 接收用户输入, 遍历数组,逐一比较,
	3. 如果有,则提示信息,并退出 */
	
	//定义一个字符串数组 
	String[] names = {"白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"}; 
	Scanner myScanner = new Scanner(System.in); 
	System.out.println("请输入名字"); 
	String findName = myScanner.next(); 
	//遍历数组,逐一比较,如果有,则提示信息,并退出 
	//这里给大家一个编程思想/技巧, 一个经典的方法 
	int index = -1; 
	for(int i = 0; i < names.length; i++) {
	//比较 字符串比较 equals, 如果要找到名字就是当前元素 
		if(findName.equals(names[i])) {
			System.out.println("恭喜你找到 " + findName); 
			System.out.println("下标为= " + i); 
			//把 i 保存到 index 
			index = i; 
			break;//退出 
		} 
	}
	if(index == -1) { 
	//没有找到 
		System.out.println("sorry ,没有找到 " + findName); 
	}
	}
}

8.多维数组-二维数组

  1. 从定义形式上看 int[][]
  2. 可以这样理解,原来的一维数组的每个元素是一维数组, 就构成二维数组
    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} };
  3. 二维数组的每个元素是一维数组, 所以如果需要得到每个一维数组的值

8.1静态初始化

  1. 语法: 类型[][] 数组名=new 类型[大小][大小]
  2. 比如: int a[][]=new int[2][3]
  3. 使用演示
  4. 二维数组在内存的存在形式(!!画图)
    定义 类型 数组名[][] = {{值 1,值 2…},{值 1,值 2…},{值 1,值 2…}}

在这里插入图片描述

8.2动态初始化

先声明:类型 数组名[][]; TwoDimensionalArray02.java
再定义(开辟空间) 数组名 = new 类型[大小][大小]
赋值(有默认值,比如 int 类型的就是 0)

8.3二维数组的应用案例

  1. 使用二维数组打印一个 10 行杨辉三角 YangHui.java
    在这里插入图片描述

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

  1. 一维数组的声明方式有: int[] x 或者 int x[]
  2. 二维数组的声明方式有: int[][] y 或者 int[] y[] 或者 int y[][]
  3. 二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同。比如: map[][] 是 一个二维数组
    int map [][] = {{1,2},{3,4,5}}
    由 map[0] 是一个含有两个元素的一维数组 ,map[1] 是一个含有三个元素的一维数组构成,我们也称为列数不等 的二维数组

9. 本章作业

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

本文是作为作者本人的学习笔记分享交流使用,出处来自韩顺平老师

相关学习资源

全部在内需要的自取
链接:https://pan.baidu.com/s/1plzExeIUuWAim2QsUWpVJQ
提取码:67ma
–来自百度网盘超级会员V5的分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

it's all you

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值