• Java数组的简单应用


    本文记录Java数组的几个基本应用。

    数组的初始化和遍历

    数组初始化和遍历都有三种方式,参考如下代码。

     1 import java.util.Arrays;
     2 public class ArrayDemo{
     3     public static void main(String[] args){
     4         //定义数组的三种方式
     5         //方法1 动态初始化
     6         int[] arr1=new int[3];
     7         arr1[0]=1;
     8         //方法2 静态初始化
     9         int[] arr2=new int[]{1,2,3};
    10         //方法3 静态初始化省略写法
    11         int [] arr3={1,2,3};
    12         //遍历数组的三种方式
    13         //方法1 普通for循环,通过下标获取,并且可以改变数组的值
    14         System.out.println("-----------普通for循环-----------");
    15         for(int i=0;i<arr1.length;i++){
    16             arr1[i]*=2;
    17         }
    18         for(int i=0;i<arr1.length;i++){
    19             System.out.println(arr1[i]);
    20         }
    21         //方法2 增强型for循环,只能遍历数组,不能改变数组的值
    22         System.out.println("-----------增强型for循环-----------");
    23         for(int number:arr2){
    24             number*=2;
    25         }
    26         for(int number:arr2){
    27             System.out.println(number);
    28         }        
    29         //方法3 使用Arrays.toString()方法返回
    30         System.out.println("-----------使用Arrays.toString()方法返回-----------");
    31         String str=Arrays.toString(arr3);
    32         System.out.println(str);        
    33     }
    34 }

    运行结果,注意增强型for循环只能进行遍历,不能对数组内容进行修改,另外静态初始化省略的写法不能分两步写,这个需要注意下。

    求数组中最值

    求数组中最值一般有两种思路,一种是比较数值直接得到最值,另外一种是比较后得到索引,本次使用后者。

     1 public class ArrayMax{
     2     public static void main(String[] args){
     3         //获取一个数组中的最大值,采用记录下标的方式
     4         int[] arr=new int[]{12,34,1,7,5,44,98};
     5         int index=0;
     6         for(int i=1;i<arr.length;i++){
     7                 if(arr[i]>arr[index]){
     8                     index=i;
     9                 }
    10         }    
    11         //输出最大值
    12         System.out.println(arr[index]);
    13     }
    14 }

    运行结果

    冒泡排序及时间&空间复杂度

    数组的排序,Java提供了现成API可以处理,如Arrays.sort()方法(底层使用了快速排序+归并排序)可以对数组进行升序排列,此外还可以使用常用的排序方式,本文再次写冒泡和选择排序,具体的参考博文 https://www.cnblogs.com/youngchaolin/p/11097567.html

    (1)冒泡排序实现

     1 import java.util.Arrays;
     2 public class BubbleSort{
     3     public static void main(String[] args){
     4         //冒泡排序练习
     5         /**
     6         数组相邻元素两两比较,得到最大值或最小值
     7         比如给一个长度为6的数组,将有如下比较逻辑:
     8         第1次比较,比较5次
     9         第2次比较,比较4次
    10         ...
    11         第5次比较,比较1次
    12         得到比较轮序号+比较次数=数组长度
    13         比较轮次:1~数组长度-1              
    14         第i轮比较次数:数组长度-i
    15         比较轮次使用外层for循环来控制,比较次数用内层for循环
    16         */
    17         int[] arr=new int[]{1,5,7,9,22,66,32,16,55,123,456};
    18         //降序
    19         for(int i=1;i<arr.length;i++){
    20             for(int j=0;j<arr.length-i;j++){
    21                 if(arr[j]<arr[j+1]){
    22                     int temp=arr[j];
    23                     arr[j]=arr[j+1];
    24                     arr[j+1]=temp;
    25                 }
    26             }
    27             System.out.println("排序后的数组为"+Arrays.toString(arr));
    28         }    
    29         /**
    30         时间复杂度:O(n^2) 
    31         比较次数即一个等差数列,去掉常数部分
    32         空间复杂度:o(1)
    33         由于创建了3个变量,因此表示为3*n^0,去掉常数3,空间复杂度为o(1)
    34         */
    35     }
    36 }

    排序过程及结果。

    (2)选择排序实现

     1 import java.util.Arrays;
     2 public class SelectSort{
     3     public static void main(String[] args){
     4         //选择排序练习
     5         /**
     6         比较数组当前位置元素和后面所有元素,如果后面存在比当前元素大或小的,交换数值,或者使用记录下标的方式
     7         最后交换下标的数组,这里暂时采用前种方式
     8         比如给一个长度为6的数组,将有如下比较逻辑:
     9         第1次比较,比较5次
    10         第2次比较,比较4次
    11         ...
    12         第5次比较,比较1次
    13         得到比较轮序号+比较次数=数组长度
    14         比较轮次:1~数组长度-1              
    15         第i轮比较次数:数组长度-i
    16         比较轮次使用外层for循环来控制,比较次数用内层for循环
    17         */
    18         int[] arr=new int[]{1,5,7,9,22,66,32,16,55,123,456};
    19         //降序
    20         for(int i=0;i<arr.length-1;i++){
    21             for(int j=i+1;j<arr.length;j++){
    22                 if(arr[i]<arr[j]){
    23                     //使用按位异或交换
    24                     arr[i]=arr[i]^arr[j];
    25                     arr[j]=arr[i]^arr[j];//arr[j]=arr[i]^arr[j]^arr[j]=arr[i];
    26                     arr[i]=arr[i]^arr[j];//arr[i]=arr[i]^arr[j]^arr[i]=arr[j];
    27                 }
    28             }
    29             System.out.println("排序后的数组为"+Arrays.toString(arr));
    30         }
    31         /**
    32         时间复杂度:O(n^2) 
    33         比较次数即一个等差数列,去掉常数部分
    34         空间复杂度:o(1)
    35         由于创建了3个变量,因此表示为3*n^0,去掉常数3,空间复杂度为o(1)
    36         */
    37     }
    38 }

    排序过程及结果。

    数组的二分查找

    当数组是有序的情况,可以使用二分查找来查找某个数是否存在,其时间复杂度为O(logn),相比来说可能比冒泡和选择排序性能更加好。

     1 import java.util.Scanner;
     2 import java.util.Arrays;
     3 public class BinarySearch{
     4     public static void main(String[] args){
     5         //使用二分查找寻找一个数在数组中的位置
     6         /**
     7         如果数组是有序数组,先比较这个数和数组中中间位置((下标左边界+下标右边界)/2)数值的大小
     8         1 如果恰好找到了则返回数对应下标
     9         2 如果比中间值大,更新数组左边界
    10         3 如果比中间值小,更新数组右边界
    11         循环上面3个步骤,继续比较,循环的条件是 下标左边界不能大于下标右边界    
    12         */
    13         System.out.println("请输入要查找的数");
    14         Scanner scan=new Scanner(System.in);
    15         int number=scan.nextInt();
    16         
    17         int[] arr=new int[]{1,5,7,9,22,66,32,16,55,123,456,88};
    18         //变成有序数组
    19         Arrays.sort(arr);
    20         //重新打印
    21         System.out.println(Arrays.toString(arr));
    22         int minIndex=0;
    23         int maxIndex=arr.length-1;
    24         int mid=(minIndex+maxIndex)/2;
    25         while(minIndex<=maxIndex){
    26             System.out.println("比较");
    27             if(arr[mid]==number){
    28                 System.out.println("数组的下标为:"+mid);
    29                 break;
    30             }
    31             if(arr[mid]<number){
    32                 minIndex=mid+1;//mid对应的数都不相等,mid不需要比较了,继续往右边移动一位
    33             }
    34             if(arr[mid]>number){
    35                 maxIndex=mid-1;//mid对应的数都不相等,mid不需要比较了,继续往左边移动一位
    36             }
    37             mid=(minIndex+maxIndex)/2;
    38         }
    39         /**
    40         时间复杂度 O(logn)
    41         空间复杂度 o(1)
    42         */
    43     }
    44 }

    测试结果

    总结 

    以上为数组的基本知识,后续可供参考。 

  • 相关阅读:
    WebAPI 资料
    TransactionScope事务类的使用
    Go入门笔记34-Go 使用Ioctl
    解决XShell XFTP传输Go可执行文件导致出错问题
    Go入门笔记33-Go 交叉编译
    博客园添加横向菜单
    C# 正则替换、Json格式化等
    Ubuntu批量修改文件后缀
    Linux免密登录
    Go入门笔记32-继承
  • 原文地址:https://www.cnblogs.com/youngchaolin/p/11390935.html
Copyright © 2020-2023  润新知