一、数组的概念
数组概念: 数组就是用于存储数据的长度固定的容器,保证多个数据的数据类型要一致。
按照维度区分:一维数组:存储一组数据。
二维数组:存储多组数据。
按照元素类型区分:基本数据类型的元素:存储数据值
引用数据类型的元素:存储对象(本质上存储对象的首地址)
数组的定义:元素的数据类型[ ] 数组名(推荐使用)
元素的数据类型 数组名[ ]
一个数组要包含数组的维度、数组的元素类型、数组名。
//比如,要存储一个小组的成绩
//int[ ] scores;;
数组的初始化:静态初始化有三种:1.数据类型[] 数组名 = {元素1,元素2,元素3...};
//int[ ] arr = {1,2,3,4,5};
2. 数据类型[] 数组名 = new 数据类型[]{元素1,元素2.};
//int[] arr = new int[]{1,2,3,4,5};
3. 数据类型[] 数组名;
数组名 = new 数据类型[]{元素1,元素2,元素3...};
//int[] arr;
arr = new int[]{1,2,3,4,5};
动态初始化有一种:
数组存储的元素的数据类型[] 数组名 = new 数组存储的元素的数据类型[长度];
//int[] arr = new int[5];
数组的使用:数组在使用时一般是对数组进行遍历,在遍历时要注意几点:
1.数组的长度属性
2.数组下标越界异常
3.数组的下标是从0开始,到length-1结束。
4.由于数组是引用数据类型,记录了数组的地址,当把一个数组赋值给另一个数组时,两个数组此时指向同一个地址,因此两个数组相等。
二、数组的常见算法
第一类:求总和、求总乘积等
一般思想是通过定义一个变量,在遍历数组的过程中将数组中的每个元素累加到此变量上,在遍历完成后打印输出结果。
// int[] arr = {4,5,6,1,9};
//求总和、均值
int sum = 0;//因为0加上任何数都不影响结果
for(int i=0; i<arr.length; i++){
sum += arr[i];
}
System.out.println("sum = " + sum);
第二类:统计数组内特殊数值的个数(包括最大最小值)
一般思想为定义一个初始值为0的记录变量,在遍历数组时通过一个if判断语句去判断此数值时候符合特殊条件,若符合则让记录变量自增,遍历结束打印。
若为求最大最小值,则定义一个变量取数组首项假设为最大最小值,将if语句条件改变为对比条件即可,当符合时使用记录变量记录此项下标,遍历结束打印。
// int[] arr = {4,5,6,1,9};
//统计偶数个数
int evenCount = 0;
for(int i=0; i<arr.length; i++){
if(arr[i]%2==0){
evenCount++;
}
}
System.out.println("evenCount = " + evenCount);
// int[] arr = {4,5,6,1,9};
//找最大值
int max = arr[0];
for(int i=1; i<arr.length; i++){
if(arr[i] > max){
max = arr[i];
}
}
System.out.println("max = " + max);
第三类:数组的元素查找
一般思想为对数组进行遍历,依次对比所需值是否匹配,不同算法时间复杂度和空间复杂度不同。
1.顺序查找
一般思想为从下标0开始挨个对比,对数组元素顺序无要求。
2.折半查找
一般思想为每次对比数组下标为中间值的元素,若此时中间值大于所需值则去往数组左半部分查找,若中间值小于所需值则往数组右半部分查找,对数组元素要求有序排列。
第四类:数组的元素排序
一般思想为进行n轮循环,n与数组长度有关,每次循环确定一个元素的最终位置。
1.选择排序
选择排序思想为两层for循环嵌套,第一层for控制总循环次数,本质是每次循环需要确定一个元素的最终位置,第二层for是为了选择出本次需要确定最终位置的元素,若确定的元素此时不在最终应当在的位置,则将此元素交换至最终位置。
2.冒泡排序
冒泡排序思想为每次比较相邻的两个元素,若位置不对则交换,每一趟可以将一个元素确定到数组的边缘位置,类似于一个一个泡泡往前冒,若某一趟未发生一次交换,则说明数组内元素已经有序。