1.多维数组概述
数组是一个线性数据结构,用于储存一组相同数据类型的数据(长度一经定义就不能改了)
需求: 存储1个班的5名同学的成绩
double[] scores = new double[5];
scores[0] = 90;
//....
需求进阶:存储3个班的各5名同学的成绩
double[] scores1 = new double[5];
double[] scores2 = new double[5];
double[] scores3 = new double[5];
//...
多维数组:是一种嵌套的数组
常见形式为:二维数组、三维数组...
二维数组:是以一维数组作为数组元素的数组, 即“数组的数组”
2.多维数组定义
一维数组的语法:
数组元素的数据类型[] 数组名 = new 数组元素的数据类型[数组的容量/长度/元素个数];
数组元素的数据类型[] 数组名 = {元素值1,元素值2,..};
数组元素的数据类型[] 数组名 = new 数组元素的数据类型[]{元素值1,元素值2,..};
// 例如:存储5名同学成绩
double[] scores = new double[5];
double[] scores = {90, 80, 70, 60, 50};
double[] scores = new double[]{90, 80, 70, 60, 50};
// 赋值语法
数组名[下标] = 元素值;
// 例如:存储第1名同学成绩
scores[0] = 90;
从内存分配原理的角度上来看,它们都是一维数组, 是以一维数组作为数组元素的数组,即“数组的数组”
二维数组的语法:
二维数组中存储的是一个一维数组, 所以就把一维数组这个类型作为二维数组的数组元素数据类型即可。
数组元素的数据类型[] 数组名 = new 数组元素的数据类型[数组的容量/长度/元素个数];
数组元素的数据类型[] 数组名 = {元素值1,元素值2,..};
数组元素的数据类型[] 数组名 = new 数组元素的数据类型[]{元素值1,元素值2,..};
// 例如:存储3个班5名同学成绩
double[][] scores = new double[3][5];
double[][] scores = {{90, 80, 70, 60, 50}, {....}, {....}};
double[][] scores = new double[][]{{90, 80, 70, 60, 50}, {....}, {....}};
// 赋值语法
数组名[外围数组下标][内维数组下标] = 元素值;
// 例如:存储第1个班第1名同学成绩
scores[0][0] = 90;
注意:在定义二维数组时,可以省略内维数组容量。
例如:
double[][] scores = new double[3][];
scores[0] = new double[5];
scores[1] = new double[2];
scores[2] = new double[3];
相比于直接在定义时指定好内维数组容量,这种方式更为灵活,内维数组可以指定不同的数组容量。
3.多维数组的遍历
使用单重循环解决了一维数组的遍历
使用多重循环解决多维数组的遍历
// 存储3个班各5名同学成绩
double[][] scores = new double[3][5];
for (int i = 0; i < scores.length; i++){
System.out.println(i+1);
for (int j = 0; j < scores[i].length; j++){
System.out.println((i+1) + (j+1));
}
}
// 遍历
for (int i = 0; i < scores.length; i++){
System.out.println(i+1)
for (int j = 0; j < scores[i].length; j++){
System.out.println(scores[i][j])
}
}
4.多维数组的使用
// 存储3个班各5名同学
// 前面是二维数组的容量/长度
// 后面是一维数组的容量/长度
// double[][] scores = new double[3][5];
double[][] scores = new double[3][0];
scores[0] = new double[5];
scores[1] = new double[2];
scores[2] = new double[3];
scores[0][0] = 90;
System.out.println(scores[0][0]);
System.out.println(scores[0][1]);
double[][] scores1 = {{90, 80, 70, 60, 50},{40, 50, 30, 20,60},{90, 50, 60, 40, 70}};
double[][] scores2 = new double[][]{{90, 80, 70, 60, 50},{40, 50, 30, 20,60},{90, 50, 60, 40, 70}};
}
}
5.算法概述
算法(Algorithm)是指解题方案的准确而完成的描述,是一系列解决问题的清晰指令、算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的的输出。不同的算法可能用不同的时间,空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
6.排序算法
所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序。这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率。对于排序,我们首先要求其具有一定的稳定性,即当两个相同的元素同时出现于某个序列之中,则经过一定的排序算法之后,两者在排序前后的相对位置不发生变化。换言之,即便是两个完全相同的元素,它们在排序过程中也是各有区别的,不允许混淆不清。
排序算法也有很多种解决思路,常见的有:冒泡排序、选择排序、插入排序、快速排序、堆排序、归并排序、希尔排序、基数排序等
冒泡排序
它重复地走访过要排序的元素列,依次比较两个相邻的元素 ,如果顺序 (如从大到小、首字母从Z到A)错误就把他们交换过来 。(相邻元素做比较,两两比较小靠前)
冒泡排序小窍门:外层循环 n-1 , 内层循环 n-1-i
int[] arr = {11, 99, 86, 75, 33, 45, 66, 54};
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
// 1.相邻元素比较
if (arr[j] > arr[j+1]) {
// 2.变量交换:使用中间变量方式实现交换
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
选择排序
类似于打擂台求最小值的思路
int[] arr = {11, 99, 86, 75, 33, 45, 66, 54};
for (int i = 0; i < arr.length-1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
插入排序
类似于在一个已有序列中,去比较,插入新数据,并保持现有序列
int[] arr = {9, 5, 8, 6, 7, 2, 4};
for (int i = 1; i < arr.length; i++) {
for (int j = i; j > 0; j--) {
if (arr[j] < arr[j-1]) {
int temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
7.引用数据类型
java 中有8个【基本】数据类型:
数值:
整数:byte,short,int,long
浮点数:float,double
非数值:
char
boolean
引用数据类型:
数组
类(String是一个类.....)
接口
枚举