0
点赞
收藏
分享

微信扫一扫

Java中的多维数组(冒泡排序,Arrays类的使用)及稀疏数组笔记(2022.4.19)

何晓杰Dev 2022-04-19 阅读 82
java

多维数组

  • 多维数组可以看成是数组的的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。

  • 二维数组

    int a[][] = new int[2][5];

  • 解析:以上二维数组a可以看成一个两行五列的数组。

二维数组使用1:

    package com.zhai.array;  
    public class Arrays1 {
        //二维数组
        public static void main(String[] args) {
     // 定义一个二维数组{}为一组,
            int[][] a = {{1,2,3},{4,5,6},{7,8,9}};
          	//              0 ,   1 ,     2
            System.out.println(a[0][0]);
            System.out.println(a[1][0]);
            System.out.println(a[1][1]);
            System.out.println(a[2][0]);
    
            //输出所有数组
            for (int i = 0; i < a.length ; i++) {
                for (int j = 0; j <a[i].length ; j++) {
                    System.out.print(a[i][j]+" ");
                }
            }
        }
    }
    输出:
    	1
        4
        5
        7
        1 2 3 4 5 6 7 8 9 

二维数组使用2:

    package com.zhai.array;
    
    public class Arrays2 {
        public static void main(String[] args) {
            int[][] arrays = new int[2][2];   
          // 在这个数组中一共有2个一维数组,并且每一个一维数组的元素有2个
            /**
             * int[][]  第一个[]是一共有几个一位数组 ;  第二个[]是数组中元素的个数,比如你写个5,就说明这个数组的元素最多能写5个
             * 就相当于这样:
             *      1,2,3,4,5
             *      6,7,8,9,10
             */
            arrays[0][0] = 1;    // 第一个一维数组的第一个数为1
            arrays[0][2] = 2;
            arrays[1][0] = 6;     // 第二个一维数组的第一个数为6
            arrays[1][1] = 7;
    //        arrays[2][1]=1;    // 数组越界异常
            System.out.println("第一个数组中的第二个数为:"+arrays[0][2]);
            for (int i = 0; i < arrays.length ; i++) {
                for (int j = 0; j < arrays[i].length; j++) {
                    System.err.print(arrays[i][j]+" ");
                }
            }
    
        }
    }
    输出:
    	第一个数组中的第二个数为:2
    	1 2 6 7 

注意:其实在二维数组中第一个[]是一共有几个一维数组,第二个[]是这个一维数组中有几个元素;二维数组也就相当于一维数组的两层嵌套,切记:取值一定是从下标0开始,否则就会报出数组越界异常!

数组中的Arrays类

  • 数组中的工具类 java.util.Arrays。
  • 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。
  • 查看JDK帮助文档。
  • Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而”不用“对象来调用(注意:是”不用“不是”不能“)。
  • 具有以下常用功能:
    • 给数组赋值:通过 fill 方法。
    • 对数组进行排序:通过 sort 方法,按升序。
    • 比较数组:通过 equals 方法比较数组中元素值是否相等。
    • 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法进行操作。

Arrayys类的使用:

    package com.zhai.array;
    import java.util.Arrays;
    public class Arrays3 {
        // 使用 Arrays 类
        public static void main(String[] args) {
            int[] a = {2,6,7,9,4,3,1,5};
            // Arrays类中都是静态方法所以直接使用类名.方法名
            Arrays.sort(a);    // sort是排序方法,排序列表是升序
            Arrays.fill(a,2,4,0);   // 填充方法,可以把数组中的数据进行覆盖; 也可以进行选择型的覆盖
            System.out.println(Arrays.toString(a));   // toString()方法可以进行打印输出
            printA(a);
        }
    // 不使用工具类的情况下我们需要自己动手编写方法
        public static void printA(int[] a){
            for (int i = 0; i < a.length; i++) {
                System.out.print(a[i] +" ");
            }
        }
    }
    
    输出:
    	[1, 2, 0, 0, 5, 6, 7, 9]
    	1 2 0 0 5 6 7 9 

解析:这里使用到了Arrays中的两个方法,第一个是:toString()方法,可以进行打印输出;第二个是:sort()方法,可以将数据进行升序的列表进行排序;fill方法是把数组中的数据进行覆盖,也可以尽心选择性的覆盖如:2,4,0意思就是把数组中下标为2~4之间的数据用0覆盖。

冒泡排序

  • 在排序中共有八大排序,且用的最多以及最出名的就是冒泡排序。
    package com.zhai.array;
    import java.util.Arrays;
    /*
            冒泡排序
            1、比较数组中,两个相邻的元素,如果第一个数比第二个数大,就要交换它们的位置
            2、每一次比较,都会产生出一个最大,或者最小的数字;
            3、下一轮测可以少一次排序
            4、依次执行,直到结束
         */
    public class Arrays4 {
        public static void main(String[] args) {
            int[] i = {5, 1, 3, 4, 6, 7, 8, 94, 2, 234};
            int[] sort = sort(i);
            System.out.println(Arrays.toString(i));
        }
    
        public static int[] sort(int[] a) {
            int c = 0;
            boolean b = false;
            for (int i = 0; i < a.length - 1; i++) {   // 让外层循环长度减1是为了不溢出
                for (int j = 0; j < a.length - 1 - i; j++) {   
              // 减i的原因是每一次比较出来的总会有一个大,这个大的就不在进行这次循环下次循环将会继续
                    if (a[j+1] < a[j]) {   // 也就是如果a数组中的后一个数字小于当前这个数字
                        c = a[j];     // 那么就将当前这个数字赋值给c
                        a[j] = a[j+1];  // 将后一个数字赋值给当前这个数字
                        a[j+1] = c;   // 然后将当前的数字(c)的值赋值给后一个数字
                        b = true;   // 优化排序
                    }
                }
                if (b == false){  // 当已经排好的数字就不再进入循环继续执行
                    break;
                }
            }
            return a;
        }
    }
    输出:
    	[1, 2, 3, 4, 5, 6, 7, 8, 94, 234]

解析:其实就相当于两个杯子现在都装满水,但是现在想把它们两个进行交换,就需要一个空的杯子,就如:

注意:冒泡排序的时间复杂度为:o(n2);

稀疏数组(拓展)

  • 稀疏数组它是一种数据结构(思想)。
  • 当一个数组中大部分元素为0或者为同一值的数据时,可以使用稀疏数组来保存该数组。
  • 稀疏数组的处理方式:
    • 记录数组一共有几行几列,有多少个不同值;
    • 把具有不同值的元素和行列几值记录在一个小规模的数组中,从而缩小程序的规模;
  • 记录有效的坐标值。

稀疏数组的使用:

    package com.zhai.array;
    /*
        稀疏数组
     */
    public class Arrays5 {
        public static void main(String[] args) {
            int[][] arrays = new int[11][11];
            arrays[1][2]=1;
            arrays[2][3]=2;
            for (int[] array : arrays) {
                for (int a : array) {
                    System.out.print(a+ "\t");
                }
                System.out.println();
            }
            // 转换为稀疏数组保存
            // 获取有效值的个数
            int sum = 0;
            for (int i = 0; i < 11; i++) {
                for (int j = 0; j < 11 ; j++) {
                    if (arrays[i][j]!=0){
                        sum++;
                    }
                }
            }
            System.out.println("有效值的个数:"+sum);
            // 创建一个稀疏数组
            int[][] arrays1 = new int[sum+1][3];
            arrays1[0][0] = 11;
            arrays1[0][1] = 11;
            arrays1[0][2] = sum;
            // 遍历二维数组,将非零的值,存放在稀疏数组中
            int count = 0;
            for (int i = 0; i < arrays.length; i++) {
                for (int j = 0; j < arrays[i].length; j++) {
                    if (arrays[i][j]!=0){
                        count++;
                        arrays1[count][0] = i;  //
                        arrays1[count][1] = j;
                        arrays1[count][2] = arrays[i][j];
                    }
                }
            }
            // 输出
            System.out.println("输出稀疏数组:");
            for (int[] ints : arrays1) {
                System.out.println(ints[0] + "\t"
                        + ints[1] + "\t"
                        + ints[2] + "\t");
    
            }
            // 还原原始数组
            int[][] arrays2 = new int[arrays1[0][0]][arrays1[0][1]];
            // 给其中的元素进行还原
            for (int i = 1; i < arrays1.length; i++) {
               arrays2[arrays1[i][0]][arrays1[i][1]] = arrays1[i][2];
            }
            // 输出
            for (int[] array : arrays2) {
                for (int a : array) {
                    System.out.print(a+ "\t");
                }
                System.out.println();
            }
        }
    }
    输出:
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	1	0	0	0	0	0	0	0	0	
            0	0	0	2	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	
            有效值的个数:2
            输出稀疏数组:
            11	11	2	
            1	2	1	
            2	3	2	
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	1	0	0	0	0	0	0	0	0	
            0	0	0	2	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	
            0	0	0	0	0	0	0	0	0	0	0	

含义:其实呢,稀疏数组的作用就是从一堆数据中把有值的取出来,变成一个小数组。

举报

相关推荐

0 条评论