[Java基础] 数组、排序、查找(五)

一、数组介绍

数组可以存放多个同一类型的数据

数组也是一种数据类型,是引用类型

二、数组的使用

1. 初始化

  • 动态初始化1:数据类型 数组名[] = new 数据类型[大小]
int a[] = new int[5];
  • 动态初始化2:数据类型[] 数组名; 数组名 = new 数据类型[大小]
    (先声明,后开辟)
int[] a;
a =  = new int[5];
  • 静态初始化:数据类型 数组名[] = {元素值,元素值…}
int a[] = {1, 2, 3};
int a[3] = {1, 2, 3};	//❌不能[3]
int a[] = new int[]{1, 2, 3};	//✅

2. 引用

  • 数组名[下标/索引/index]
  • 数组的下标从0开始

3. 注意示例

  • 数组是多个相同类型数据的组合,实现对这些数据的统一管理
  • 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用
  • 数组创建后,如果没有赋值,有默认值
int 0
short 0
byte 0
float 0.0
double 0.0
char \u0000
boolean false
String null	//⚠️
  • 数组的下标从0开始
  • 数组下标必须在指定范围内使用,否则报错
  • 数组属于引用类型,数组型数据是对象

三、数组赋值机制

1. 值拷贝

  • 基本数据类型赋值,这个值就是具体的数据,而且相互不影响(值拷贝

2. 引用传递

int n1 = 2;
int n2 = n1;	//n1 = 2;n2 = 2;
  • 数组在默认情况下时引用传递,赋的值是地址
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1;
arr2[0] = 10;	//arr1[0] = 10⚠️

在这里插入图片描述

四、数组拷贝

public static void main(String[] args){
	int[] arr1 = {1,2,3};

	int[] arr2 = new int[arr1.length];	//开辟新数组

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

	arr2[0] = 100;	//修改arr2,不会对arr1有影响

	System.out.println(arr1[0]);	//arr1[0]=1⚠️不影响arr1
}

五、数组扩容

public static void main(String[] args){
	int[] arr = {1,2,3};	//初始化数组
 
 	do{
		int[] newArr = new int[arr.length + 1];	//开辟新数组
		for(int i=0; i<arr.length; i++){
			newArr[i] = arr[i];
		}
		//添加想要添加元素
		System.out.println(“请输入想要添加元素:”);
		int addNum = myScanner.nextInt();
		newArr[newArr.length - 1] = addNum;
		//让arr指向newArr
		arr = newArr;
		//输出看效果
		for(int i=0; i<arr.length; i++){
			System.out.println(arr[i] + "\t");
		}
		//问用户是否继续
		System.out.println(“是否继续添加 y/n”);
		char key = myScanner.next().charAt(0);
		if(key == 'n'){
			break;
		}
	}(true);
}

六、二维数组的使用

1. 初始化

  • 动态初始化1:数据类型 数组名[][] = new 数据类型[大小][大小]
int a[][] = new int[2][3];
  • 动态初始化2:数据类型[][] 数组名; 数组名 = new 数据类型[大小][大小]
    (先声明,后开辟)
int[][] a;
a = new int[2][3];
  • 动态初始化3,列数不确定:数据类型 数组名[][] = new 数据类型[大小][]
int a[][];
a = new int[2][3];
  • 静态初始化:数据类型 数组名[][] = {{值1,值2…},{值1,值2…},{}…}
int a[][] = {{1,2,3},{4,5},{6}};

2. 注意示例

  • 一维数组声明方式:
int[] x;
int x[];
  • 二维数组声明方式:
int[][] y;
int y[][];
int[] y[];	//⚠️

七、排序

1. 基本介绍

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

2. 内部排序

将需要处理的所有数据都加载到内部存储器中进行排序

  • 交换式排序法
  • 选择式排序法
  • 插入式排序法

3. 外部排序

数据量过大,无法全部加载到内存中,需要借助外部存储进行排序

  • 合并排序法
  • 直接合并排序法

4. 冒泡排序

通过对待排序序列从后往前,依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移动到后面

for(int i = 0;i < arr.length;i++){
	for(int j = 0;j < arr.length-1-i;j++){
		if(arr[j]>arr[i]){
			int temp = arr[j];
			arr[j] = arr[i];
			arr[i] = temp;
		}
	}
}

八、查找

1. 顺序查找

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

2. 二分查找

int left = 0;
int right = arr.length - 1;
while(left <= right){
	int middle = left + (right - left)>>1;
	if(arr[middle] > key){
		right = middle - 1;
	}else if(arr[middle] > key){
		left = middle + 1;
	}else{
		return middle;	
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你怎么知道我头发乌黑浓密

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

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

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

打赏作者

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

抵扣说明:

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

余额充值