Java数组扩展

目录

一、多维数组(以二维数组为例)

多维数组的动态初始化

多维数组的引用

二、Arrays类

三、冒泡排序

四、稀疏数组


一、多维数组(以二维数组为例)

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

 String str[][] = new String[3][4];

多维数组的动态初始化

1、直接为每一维分配空间

格式如下:

 type[][] typeName = new type[typeLength1][typeLength2];
 int[][] a = new int[2][3];

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

  • type 可以为基本数据类型和复合数据类型

  • typeLength1 和 typeLength2 必须为正整数

  • typeLength1 为行数,typeLength2 为列数

2、从最高维开始,分别为每一维分配空间

例如:

 String[][] s = new String[2][];
 s[0] = new String[2];
 s[1] = new String[3];
 s[0][0] = new String("Good");
 s[0][1] = new String("Luck");
 s[1][0] = new String("to");
 s[1][1] = new String("you");
 s[1][2] = new String("!");

解析:

  • s[0]=new String[2]s[1]=new String[3] 是为最高维分配引用空间,也就是为最高维限制其能保存数据的最长的长度

  • 然后再为其每个数组元素单独分配空间 s0=new String("Good") 等操作。

多维数组的引用

对二维数组中的每个元素,引用方式为

  arrayName[index1][index2];
 num[1][0];

二、Arrays类

java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。

功能

  • 给数组赋值:通过 fill 方法。

  • 对数组排序:通过 sort 方法,按升序。

  • 比较数组:通过 equals 方法比较数组中元素值是否相等。

  • 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。

具体说明请查看下表:

序号方法和说明
1public static int binarySearch(Object[] a, Object key) 用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。
2public static boolean equals(long[] a, long[] a2) 如果两个指定的 long 型数组彼此相等,则返回 true。如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
3public static void fill(int[] a, int val) 将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
4public static void sort(Object[] a) 对指定对象数组根据其元素的自然顺序进行升序排列。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。

三、冒泡排序

1、原理

1、从第一个数据开始,与第二个数据相比较,如果第二个数据小于第一个数据,则交换两个数据的位置。

2、指针由第一个数据移向第二个数据,第二个数据与第三个数据相比较,如果第三个数据小于第二个数据,则交换两个数据的位置。

3、依此类推,完成第一轮排序。第一轮排序结束后,最大的元素被移到了最右面。

4、依照上面的过程进行第二轮排序,将第二大的排在倒数第二的位置。

5、重复上述过程,没排完一轮,比较次数就减少一次。

2、例子

待排序数据:7, 6, 9, 8, 5,1

第一轮排序过程:

 指针先指向7,7和6比较,6<7,交换6和7的位置,结果为:6,7,9,8,5,1
 指针指向第二个元素7,7和9比较,9>7,不用交换位置,结果仍为:6,7,9,8,5,1
 指针指向第三个元素9,比较9和8,8<9,交换8和9的位置,结果为:6,7,8,9,5,1
 指针指向第四个元素9,比较9和5,5<9,交换5和9,结果为:6,7,8,5,9,1
 指针指向第五个元素9,比较9和1,1<9,交换1和9的位置,结果为6,7,8,5,1,9

第一轮排序结束后,最大的数字9被移到了最右边。

进行第二轮排序,过程同上,只是由于最大的9已经放在最右边了,因此不用在比较9了,少了一次比较,第二轮结束的结果为:6,7,5,1,8,9

第三轮结果:6,5,1,7,8,9

第四轮比较结果:5,1,6,7,8,9

第五轮比较结果:1,5,6,7,8,9

最终排序结果为:1,5,6,7,8,9

由上可知N个数据排序,需要进行N-1轮排序;第i轮排序需要的比较次数为N-i次。

3、编码思路

需要两层循环,第一层循环i表示排序的轮数,第二层循环j表示比较的次数。

我们看到嵌套循环,应该立马就可以得出这个算法的时间复杂度为0(n2)。

4、代码实现

 public class ArrayDemo09 {
     public static void main(String[] args) {
         int[] a = {12, 14, 34, 32, 15};
         int[] sort = sort(a);
         System.out.println(Arrays.toString(sort));
     }
 ​
     public static int[] sort(int[] array) {
         //临时变量
         int temp = 0;
         //外层循环:判断循环多少次
         for (int i = 0; i < array.length - 1; i++) {
             //通过flag标识位减少没有意义的比较
             boolean flag = false;
             //内存循环:判断比较次数
             for (int j = 0; j < array.length - 1 - i; j++) {
                 if (array[j + 1] > array[j]) {
                     temp = array[j];
                     array[j] = array[j + 1];
                     array[j + 1] = temp;
                     flag = true;
                 }
             }
             //冒泡排序优化
             if (flag == false) {
                 //没有进行比较,跳出循环,降低时间成本
                 break;
             }
         }
         return array;
     }
     //i=0 j<4           i=1 j<3        i=2 j<2        i=3 j<1
     //14,34,32,15,12    34,32,15,14
 ​
     /*冒泡排序
      1.比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置
      2.每一次比较,都会产生出一个最大, 或者最小的数字;
      3.下一轮则可以少一次排序!
      4.依次衙环,直到结束!
      */
 }
 ​

四、稀疏数组

当一个数组中大部分元素为0,或者为同一值的数据时,可以使用稀疏数组来保存该数组

处理方式:

1、记录数组一共有几行几列,有多少不同值

2、把具有不同值的元素和行列数、值记录在一个小规模的数组中,从而缩小程序的规模

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值