数组中涉及的常见算法

数组中涉及的常见算法:

  • 数组元素的赋值
  • 求数值型数组中元素的最大值,最小值,平均数,总和等
  • 数组的复制,反转,查找(线性查找,二分法查找)
  • 数组的排序

练习题总结:

第一类问题:创建一个长度为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 }

 

运行结果:

 

八种排序的比较:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
posted @ 2019-08-06 11:16  Boogiever  阅读(227)  评论(0编辑  收藏  举报