数组中涉及的常见算法
数组中涉及的常见算法:
- 数组元素的赋值
- 求数值型数组中元素的最大值,最小值,平均数,总和等
- 数组的复制,反转,查找(线性查找,二分法查找)
- 数组的排序
练习题总结:
第一类问题:创建一个长度为6的int型数组,要求取值1-30,随机赋值,同时要求元素的值各不相同
1 public class ArrayExer { 2 public static void main(String[] args) { 3 int[] array=new int[6]; 4 for(int i=0;i<array.length;i++) { 5 array[i]=(int) (Math.random() * 30)+1;//因为random是左闭右开式,所以得加一 6 for(int j=0;j<i;j++) { 7 if(array[i]==array[j]) { 8 i--; 9 break; 10 } 11 } 12 } 13 for(int i=0;i<array.length;i++) { 14 System.out.println(array[i]); 15 } 16 } 17 18 }
理解:array[j]代表的是已生成的array[i];一旦有相等的值,就i--重新生成新的值;
第二类问题:创建一个int型的一维数组,包含10个元素,随机赋值,然后求取所有元素的最大值,最小值,平均数,总和等;要求:所有随机数都是两位数
1 public class ArrayExer2 { 2 public static void main(String[] args) { 3 int[] arr = new int[10]; 4 int Max = 0; 5 int Avg = 0; 6 int Sum = 0; 7 for (int i = 0; i < arr.length; i++) { 8 arr[i] = (int) (Math.random() * 99) + 1; 9 System.out.println("第" + i + "个数是:" + arr[i]); 10 // 求总和 11 Sum += arr[i]; 12 // 求平均值 13 Avg = Sum / 10; 14 // 求最大值 15 if (Max < arr[i]) { 16 Max = arr[i]; 17 } 18 } 19 // 求最小值 20 int Min = arr[1]; 21 for (int i = 0; i < arr.length; i++) { 22 if (Min > arr[i]) { 23 Min = arr[i]; 24 } 25 } 26 System.out.println("这十个数中的最大值是:" + Max); 27 System.out.println("这十个数中的最小值是:" + Min); 28 System.out.println("这十个数平均数是:" + Avg); 29 System.out.println("这十个数总和是:" + Sum); 30 } 31 }
运行结果:
第三类问题之其一:数组的复制。
- 创建一个名为ArraExer3的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数组,
- 使用{},把array1初始化为八个素数:2,3,5,7,11,13,17,19;
- 显示array1的内容
- 赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值(如array[0]=0;array[2]=2;)打印出array1;
1 public class ArrayExer3 { 2 public static void main(String[] args) { 3 int[] array1=new int[] {2,3,5,7,11,13,17,19}; 4 //遍历array1[] 5 for(int i=0;i<array1.length;i++) { 6 System.out.print(array1[i]+" "); 7 } 8 int[] array2=array1;//这个操作不能成为数组的复制 9 //修改array2中的偶索引元素 10 for(int i=0;i<array1.length;i++) { 11 if(i%2==0) { 12 array2[i]=i; 13 } 14 System.out.println(); 15 System.out.print("修改后的array1为:"+array1[i]+" "); 16 } 17 System.out.println(); 18 System.out.println(array1); 19 System.out.print(array2); 20 } 21 }
运行结果:
此时,内存存储情况如下图所示:
理解:通过此例,说明第八行的操作并不是复制,而是类似于Windows的创建快捷键。
array1和array2地址值相同,都指向了堆空间的唯一的一个数组实体。内存中只有出现new才在堆中开辟新的内存空间。
改正之后:
- 创建一个名为ArraExer3的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数
- 使用{},把array1初始化为八个素数:2,3,5,7,11,13,17,19;
- 显示array1的内容
- 实现array2对array1的复制,修改array2中的偶索引元素,使其等于索引值(如array[0]=0;array[2]=2;)打印出array1;
1 public class ArrayExer3 { 2 public static void main(String[] args) { 3 int[] array1=new int[] {2,3,5,7,11,13,17,19}; 4 //遍历array1[] 5 for(int i=0;i<array1.length;i++) { 6 System.out.print(array1[i]+" "); 7 } 8 //数组的复制 9 int[] array2=new int[8]; 10 for(int i=0;i<array2.length;i++) { 11 array2[i]=array1[i]; 12 } 13 //修改array2中的偶索引元素 14 for(int i=0;i<array1.length;i++) { 15 if(i%2==0) { 16 array2[i]=i; 17 } 18 System.out.println(); 19 System.out.print("修改后的array2为:"+array2[i]+" "); 20 System.out.print("修改后的array1为:"+array1[i]+" "); 21 } 22 System.out.println(); 23 System.out.println(array1); 24 System.out.print(array2); 25 } 26 }
运行结果:
此时,内存存储情况变为 如下图所示:
第三类问题之其二:数组的反转。
public class ArrayExer5 { public static void main(String[] args) { String[] arr = new String[] { "WW", "ZZ", "YY", "MM", "DD", "SS", "XX" }; // 数组的反转 for (int i = 0; i < arr.length / 2; i++) { String temp = arr[i]; arr[i] = arr[arr.length - 1 - i]; arr[arr.length - 1 - i] = temp; } for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } }
运行结果:
第三类问题之其三:数组的查找———线性查找
1 public class ArrayExer5 { 2 public static void main(String[] args) { 3 String[] arr = new String[] { "WW", "ZZ", "YY", "MM", "DD", "SS", "XX" }; 4 // 数组的查找 5 String dest = "YY"; 6 7 boolean isflag = true; 8 for (int i = 0; i < arr.length; i++) { 9 if (dest == arr[i]) { 10 System.out.println("找到了指定的元素:" + "位置在" + i); 11 isflag = false; 12 break; 13 } 14 15 } 16 if (isflag) { 17 System.out.println("很遗憾,没有找到您要的数据!"); 18 } 19 } 20 }
运行结果:
第三类问题之其三:数组的查找———二分法查找
前提:所要查找的数组必須有序;
1 public class ArrayExer6 { 2 public static void main(String[] args) { 3 int[] arr=new int[] {-23,34,61,94,134,165}; 4 int dest=34; 5 //初始的首索引 6 int head=0; 7 //初始的末索引 8 int end=arr.length-1; 9 boolean isFlag = true; 10 while(head<=end) { 11 int middle=(head+end)/2; 12 if(dest==arr[middle]) { 13 System.out.println("找到了指定的元素:" + "位置在" + middle); 14 isFlag=false; 15 break; 16 }else if(dest<arr[middle]) { 17 end=middle-1; 18 }else { 19 head=middle+1; 20 } 21 } 22 if(isFlag) { 23 System.out.println("很遗憾,没有找到您要的数据!"); 24 25 } 26 } 27 }
第四类问题:数组的排序之冒泡排序
1 public class Bubblesort { 2 public static void main(String[] args) { 3 int[] arr=new int[] {-12,45,62,72,19,-12,95,39}; 4 //冒泡排序 升序排列 5 for(int i=0;i<arr.length;i++) { 6 for(int j=0;j<arr.length-1-i;j++) { 7 if(arr[j]>arr[j+1]) {//改成小于就是降序排列 8 int temp=arr[j]; 9 arr[j]=arr[j+1]; 10 arr[j+1]=temp; 11 } 12 } 13 } 14 for(int i=0;i<arr.length;i++) { 15 System.out.print(arr[i]+" "); 16 } 17 } 18 }
运行结果:
八种排序的比较: