文章目录
1. 获取arr数组中所有元素的和
获取arr数组中所有元素的和(数组有三行,每行个数不一样)
i\j | j = 0 | j=1 | j=2 | j=3 |
---|---|---|---|---|
i=0 | 3 | 5 | 8 | - |
i=1 | 12 | 9 | - | - |
i=2 | 7 | 0 | 6 | 4 |
public class ArrTest{
public static void main(String[] args){
int[][] arr1 = new int[][]{{3,5,8},{12,9},{7,0,6,4}};
int sum = 0;
for(int i =0; i < arr.length;i++){
for(int j =0; j <arr[i].length;j++){
sum += arr[i][j];
}
}
System.out.println("总和为:" + sum );
}
}
2.练习
声明:int[] x,y[];在给x,y变量赋值以后,以下选项允许通过编译的是:
1) x[0] = y;
2) y[0] = x;
3) y[0][0] = x;
4) x[0][0] = y;
5) y[0][0] = x[0];
6) x = y;
答案:2),5)
分析:x为int型的一维数组,y为int型的二维数组
1) x[0] = y;//x[0]为int型,y为二维数组,无法赋值
2) y[0] = x;//y[0]为一维数组,x也为一维数组
3) y[0][0] = x;//y[0][0]为int型,x为一维数组
4) x[0][0] = y;//x[0][0]写法错误,x为一维数组
5) y[0][0] = x[0];//y[0][0]为int型,x[0]为int型
6) x = y;//x为int型的一维数组,y为int型的二维数组
3.数组中涉及的常见算法
3.1 数组元素的赋值(杨辉三角、回形数等)
提示:
1.第一行有一个元素,第n行有n个元素
2.每一行的第一个元素和最后一个元素都是1
3.从第三行开始,对于非第一个元素和最后一个元素的元素,即:
yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
如下图:
public class ArrTest{
public static void main(String[] args){
//1.声明并初始化二维数组
int[][] yangHui = new int[10][];
//2. 给数组的元素赋值
for(int i = 0; i < yangHui.length;i++){
yangHui[i] = new int[i+1];
//2.1给首末元素赋值
yangHui[i][0] = 1;
yangHui[i][i] = 1;
//2.2给每行的非首末元素赋值
if(i > 1){
for(int j =1;j < yangHui[i].length-1;j++){
yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j];
}
}
}
//3.遍历二维数组
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();
}
}
}
3.2 求数值型数组中元素的最大值、最小值、平均数、总和等
定义一个int型的一维数组,包含10个元素,分别赋予一些随机整数,
然后求出所有元素的最大值、最小值、和值、平均值,并输出出来。
要求:所有随机数都是两位数
class ArraTest{
public static void main(String[] args){
int[] arr1 = new int[10];
for(int i = 0;i < arr1.length;i++){
arr1[i] = (int)(Math.random() * (99 - 10 + 1) + 10);
System.out.print(arr1[i] + " ");
}
System.out.println();
//求数组元素的最大值
int max = arr1[0];
for(int i = 1;i < arr1.length;i++){
if(arr1[i] > max){
max = arr1[i];
}
}
System.out.println("最大值为:" + max);
//求数组元素的最小值
int min = arr1[0];
for(int i = 1;i < arr1.length;i++){
if(arr1[i] < min){
min = arr1[i];
}
}
System.out.println("最小值为:" + min);
//求和
int sum = 0;
for(int i = 0;i < arr1.length;i++){
sum += arr1[i];
}
System.out.println("和为:" + sum);
System.out.println("平均值为:" + sum/ arr1.length);
}
}
3.3 数组的复制、反转、查找(线性查找、二分法查找)
public class ArraTest{
public static void main(String[] args){
int[] arr1;
arr1 = new int[]{2,3,5,7,11,13,15,17};
//显示arr1的内容
for (int i = 0;i < arr1.length;i++){
System.out.print(arr1[i] + "\t");
}
System.out.println();
//数组的复制(区别于数组变量的赋值,arr2 = arr1)
int[] arr2 = new int[arr1.length];
for (int i = 0;i < arr2.length; i++){
arr2[i] = arr1[i];
}
// arr2 = arr1;赋值arr2变量等于arr1,不能称作数组的复制。
}
}
反转
public class ArraTest{
public static void main(String[] args){
String[] arr1 = new String[]{"a","b","c","d","e","f","g"};
//方法一
for (int i = 0; i < arr1.length/2; i++) {
String temp = arr1[i];
arr1[i] = arr1[arr1.length - 1- i];
arr1[arr1.length -1 -i] = temp;
}
//遍历
for (int i = 0;i < arr1.length;i++) {
System.out.print(arr1[i] + " ");
}
System.out.println();
//方法二
for (int i = 0,j = arr1.length -1; i < j; i++,j--) {
String temp = arr1[i];
arr1[i] = arr1[j];
arr1[j] = temp;
}
//遍历
for (int i = 0;i < arr1.length;i++) {
System.out.print(arr1[i] + " ");
}
}
}
线性查找
public class ArraTest{
public static void main(String[] args){
String[] arr1 = new String[]{"a","b","c","d","e","f","g"};
String dest = "c";
boolean isFlag = true;
for (int i = 0;i < arr1.length;i++){
if(dest.equals(arr1[i])){
System.out.println("找到了," + "位置为" + i);
isFlag = false;
break;
}
}
if(isFlag){
System.out.println("很遗憾,没找到");
}
}
}
二分法:
前提:所要查找的数组必须有序
public class ArraTest{
public static void main(String[] args){
int[] arr1 = new int[]{-89,0,23,45,78,234,567,789,879};
int dest = 890;//要查找的目标
int head = 0;//标志首位下标
int end = arr1.length -1;//标志末尾下标
boolean isFlag = true;
while(head <= end){
if(dest == arr1[(head + end)/2]){
System.out.println("找到了,位置为" + (head + end)/2);
isFlag = false;
break;
}else if(dest < arr1[(head + end)/2] ){
end = (head + end)/2 - 1;
}else {
head = (head + end)/2 + 1;
}
}
if(isFlag){
System.out.println("很遗憾,没找到" );
}
}
}
4. 数组中涉及到的常见算法——排序算法
1、衡量排序算法的优劣
- 时间复杂度:分析关键字的比较次数和记录的移动次数
- 空间复杂度:分析排序算法中需要多少辅助内存
- 稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的
2、排序算法分类:内部排序和外部排序
- 内部排序:整个排序过程不需要借助外部存储器(如磁盘等),所有排序操作都在内存中完成。
- 外部排序:参与排序的数据非常多,数据量非常大,计算机无法把整个排序过程放在内存中完成,必须借助外部存储器,外部排序最常见的是多路归并排序,可以认为外部排序是由多次内部排序组成。
3、十大内部排序算法
- 选择排序
直接选择排序、堆排序(知道排序思想) - 交换排序
冒泡排序、快速排序(会手写) - 插入排序
直接插入排序、折半插入排序、Shell排序 - 归并排序(知道排序思想)
- 桶式排序(少见)
- 基数排序(少见)
4、算法的5大特征
4.1冒泡排序
冒泡排序时间复杂度:O(n^2)
冒泡排序原理:重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把他们交换过来
排序思想:
1、比较相邻的元素,如果第一个比第二个大(升序),就交换它们两个;
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这步做完后,最后的元素会是最大的数;
3、针对所有的元素重复以上的步骤,除了最后一个;
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较为止。
class BubbleSortTest()
public static void main(String[] args){
int[] arr = new int[]{43,32,76,-98,0,64,33,-21,32,99};
for(i = 0;i < arr.length - 1;i++){
for(j = 0; j < arr.length - 1 -i;j++){
if(arr[j] > arr[j+1]){
int temp;
temp = arr[j+1];
arr[j+1] = arr[j];
a[j] = temp;
}
}
}
for(i = 0;i < arr.length;i++){
System.out.print{arr[i] + " "};
}
}
4.2 快速排序
快速排序时间复杂度为O(nlog(n))
排序思想:
- 从数列中挑出一个元素称为”基准“;
- 重新排序数列,所有元素比基准小的值摆放在基准前面,比基准大的值摆在基准后面,在这个分区结束之后,该基准处于数列的中间位置(不一定是二分之一),这个称为分区操作;
- 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序;
- 递归的最底部情形是,数列的大小是0或1,也就是永远都已经被排序好了,虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代中,它至少会把一个元素摆到它最后的位置去。
5.排序算法性能对比
6.Arrays工具类的使用
java.util.Arrays类是操作数组的工具类,里面有很多操作数组的方法。例如:
方法 | 作用 |
---|---|
boolean eauals(int[] a,int[] b) | 判断两个数组是否相等 |
String toString(int[] a) | 输出数组信息 |
void sort(int[] a) | 对数组进行排序 |
int binarySearch(int[] a,int key) | 对排序后的数组使用二分法检索指定的值 |
7.数组使用过程中的常见异常
- 数组角标越界的异常:ArrayIndexOutofBoundsException
- 空指针异常:NullPointerException
一旦出现异常,后面的代码不再执行。