数组进阶----算法中的数组
数组中涉及到的常见的算法和其他问题
一、数组元素的赋值(杨辉三角、回行数)
杨辉三角
package com.xunaxiao.array; public class ArrayTest4 { public static void main(String[] args) { /* * 使用二维数组打印一个10行杨辉三角; * 第一行有1个元素,第n行有n个元素; * 每一行的第一个元素和最后一个元素都为1; * 从第三行开始,对于非第一个元素和最后一个元素,其值为上面一个元素和上面的前面一个元素的和; */ int[][] hanghui = new int[10][]; for(int i=0;i<hanghui.length;i++) { hanghui[i] = new int[i+1]; hanghui[i][0] = hanghui[i][i] = 1; for(int j = 1;j < hanghui[i].length-1;j++) { hanghui[i][j] = hanghui[i-1][j] + hanghui[i-1][j-1]; } } for(int i= 0;i<hanghui.length;i++) { for(int j =0;j<hanghui[i].length;j++) { System.out.print(hanghui[i][j] + " "); } System.out.println(); } } }
回行数
二、数值中数组中元素的最大值,最小值,平均数、总和
package com.xunaxiao.array; public class ArrayTest10 { public static void main(String[] args) { /* * 定义一个int型的一维数组,包含10个元素,分别赋值一下随机整数 * 然后求出所有元素的最大值,最小值,和值,平均值。 * 要求:所有整数都是两位是 */ int[] array = new int[10]; for(int i= 0;i<array.length;i++) { array[i] = (int)(Math.random() * 90 + 10); } for(int i= 0;i<array.length;i++) { System.out.print(array[i] + " "); } int max = array[0]; int min = array[0]; int sum = 0; for(int i = 1;i < array.length; i++) { if(max < array[i]) { max = array[i]; } if(array[i] < min) { min = array[i]; } sum += array[i]; } double average = sum / array.length; System.out.println("所有元素的最大值为:" + max); System.out.println("所有元素的最小值为:" + min); System.out.println("所有元素的和值为:" + sum); System.out.println("所有元素的平均值为:" + average); } }
三、数组的复制,反转,查找(线性查找、二分法查找)
1.数组的复制
package com.xunaxiao.array;
public class ArrayTest5 {
public static void main(String[] args) {
/*
* 使用简单的数组
* 1.在main方法中声明array1和array2两个变量,他们是int类型的数组
* 2.使用静态初始化方法初始8个素数:2,3,5,7,11,13,17,19
* 显示array1的内容
* 赋值array2变量等于array1;修改array的偶索引元素,使其等于索引值(array[0] = 0,array[2] = 2),打印array1
*
* array1和array2地址值相同,都指向了堆空间唯一的一个数组实体;
* 实现真正的复制:array2 = new int[array1.length];
*/
int[] array1,array2;
array1 = new int[]{2,3,5,7,11,13,17,19};
for(int i = 0;i<array1.length;i++) {
System.out.print(array1[i] + " ");
}
System.out.println();
array2 = array1;
for(int j = 0;j<array2.length;j++) {
if(j % 2 == 0) {
array2[j] = j;
}
}
for(int i = 0;i<array1.length;i++) {
System.out.print(array1[i] + " ");
}
}
}
2.数组的反转
package com.xunaxiao.array; public class ArrayTest6 { public static void main(String[] args) { String[] array= new String[]{"JJ","DD","MM","BB","GG","AA"}; String[] array1 = new String[array.length]; for(int i = 0;i <array.length;i++) { array1[i] = array[i]; } //数组的反转 for(int j = 0;j<array.length /2;j++) { String temp = array[j]; array[j] = array[array.length-1-j]; array[array.length-1-j] = temp; } //还可以设置两个变量,一个从前一个从后进行遍历 for(int i = 0;i<array.length;i++) { System.out.print(array[i] + " "); } System.out.println(); } }
3、数组的查找
线性查找
package com.xunaxiao.array; public class ArrayTest7 { public static void main(String[] args) { String[] array= new String[]{"JJ","DD","MM","BB","GG","AA"}; String desk = "CB"; boolean sysbol = true; for(int i = 0;i<array.length;i++) { if(desk == array[i]) { System.out.println("元素的下标是:" + i); sysbol = false; break; } } if(sysbol) { System.out.println("未能找到元素"); } } }
二分法查找
使用情况:进行查找的数组是有序的
package com.xunaxiao.array; public class ArrayTest8 { public static void main(String[] args) { int[] numbers = new int[]{-98,-58,-2,8,16,58,67,99}; int desk = -1; int middle,first,end; first = 0; end = numbers.length - 1; while(first <= end) { middle = (first + end) / 2; if (desk == numbers[middle]) { System.out.println("元素下标是:" + middle); break; }else if(desk <= numbers[middle]) { end = middle-1; }else { first = middle +1; } } System.out.println("未能找到元素"); } }
四、数组元素的排序算法
冒泡排序
package com.xunaxiao.array; public class ArrayTest9 { /* * 冒泡排序 * */ public static void main(String[] args) { int[] numbers = new int[]{12,34,75,86,4,24,56,77,99}; for(int i = 0;i<numbers.length;i++) { for(int j = 0;j<numbers.length-1-i;j++) { if(numbers[j] < numbers[j+1]) {
int temp = numbers[j]; numbers[j] = numbers[j+1]; numbers[j+1] = temp; } } } for(int i = 0;i<numbers.length;i++) { System.out.print(numbers[i] + " "); } } }
快速排序
五、Arrays工具类的使用
- boolean equals(int[ ] a,int[ ] b) 作用:判断两个数组是否相等。
- String to String(int[ ] a) 作用:输出数组信息。
- void fill(int [ ] a,int val) 作用:将指定值填充到数组之中。
- void sort(int [ ] a) 作用:对数组进行排序。
- int binarySearch(int[ ] a, int key) 作用:对排序后的数组进行二分法查找。
六、数组中的常见异常
- 数组下标越界的异常:ArrayIndexOutOfBoundsException
- 空指针异常:NullPointerException
package com.xunaxiao.array; public class ArrayTest11 { public static void main(String[] args) { //数组下标越界异常 int[] array = new int[]{2,5,8,10}; // System.out.println(array[-1]); System.out.println(array[5]); //空指针异常 //情况一: int[] array1 = new int[]{1,2,3}; array1 = null; System.out.println(array1[0]); //情况二: int[][] array2 = new int[4][]; System.out.println(array2[0][0]); //情况三: String[] array3 = new String[]{"Aa","Bb","Cc"}; array3[0] = null; System.out.println(array3[0].toString()); } }