第二章、第5节 数组

概述:

​ 数组是相同数据类型的多个数据的容器

​ 这些元素按线性顺序排列。所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素;除最后一个元素外,每一个元素都有唯一的后继元素。(简单理解就是:一个跟一个顺序排列

​ 新技术:动态扩容算法<面向数组的扩容>(了解)。

创建格式:

​ 常用格式1:创建数组,并指定长度,不指定数组中的内容。

数据类型[] 数组名称 = new 数据类型[数组长度];

​ 常用格式2:创建数组的同时,指定数组中的内容。

数据类型[] 数组名称 = {数组内容1,数组内容2,...,数组内容n};

数组常用的创建方式示例:

public class Demo1{
    
    public static void main(String[] args){
        //创建数组的格式
        //常用格式1.创建数组的同时,制定数组中的内容。
        //	数据类型[] 数组名称 = {数据1,数据2,数据3,...,数据n};
        int[] ages1 = {10,11,12,13,14};
        //常用格式2.创建数组,并指定长度,不指定数组中的内容。
        //	数据类型[] 数组名称 = new 数组类型[数组长度];
        //	数据长度通过int数据指定
        int[] ages2 = new int[10];
        
        //通过下标操作数组数据的方式:
        //1. 给数组某个下标对应的空间赋值:数组名称[下标] = 值;
        ages1[0] = 100;
        //2. 从数组某个下标取值:数组名称[下标]。
        System.out.println(ages1[0]);	//100
        ages2[0] = 99;
        System.out.println(ages2[0]);	//99
        
        System.out.println("-----------------");	//华丽的分割线
        
        //如何获取数组的长度:数组名称.length
        for(int i = 0;i < ages1.length;i++){
            System.out.println(ages1[i]);
        }
    }
}

数组不常用的创建方式示例:

public class Demo2{
    
    public static void main(String[] args){
        //数组不常用的创建方式:
        //1. 创建数组,不初始化
        //格式:数组类型[] 数组名称;
        int[] nums1;
        //2. 创建数组,并指定数组中的内容
        //格式:数据类型[] 数组名称 = new 数据类型[]{内容1,内容2,内容3,...,内容n};
        int[] nums2 = new int[]{11,12,13,14,15};
    }
}
1、数组常见问题
  1. 数组下标越界和空指针问题

    示例:

    public class Demo3{
        
        public static void main(String[] args){
            //常见问题:
            //1. 数组下标越界问题:
            //int[] num1 = {10,11,12,13,14};
            //System.out.println(num1[5]);		//执行此行将产生数组下标越界异常
            
            //2.空指针问题
            //int[] num2;
            //System.out.println(num2);			//此行直接报错(空指针异常),整个程序无法运行
            //解决方案:
            int[] num2 = null;
            System.out.println(num2);
        }
    }
    
2、数组常用算法
  1. 寻找最大值或最小值

    示例:

    public class Demo4{
        
        //寻找数组中的最大值 | 最小值
        public static void mian(String[] args){
            int[] nums = {10,30,40,33,22,20,11,0};
            //1. 创建一个变量,用于存储遍历数组时发现的最大值
            int max = nums[0];
            //2. 循环取出数组中的每一个内容,从下标1开始
            for(int i = 1;i < nums.length;i++){
                //将数组中的每一个内容与max比较,如果比max大,则将nums[i]的值赋给max;相反,不变。
                max = max < nums[i] ? nums[i] : max;
            }
            System.out.println("max = " + max);	//max = 40
            
            //1. 创建一个变量,用于存储遍历数组时发现的最小值
            int min = nums[0];
            //2. 循环取出数组中的每一个内容,从下标1开始
            for(int i = 0;i < nums.length;i++){
                //将数组中的每一个内容与min比较,如果比min小,则将nums[i]的值赋给min;相反,不变。
                min = min > nums[i] ? nums[i] : min;
            }
            System.out.println("min = " + min);	//min = 0
        }
    }
    
  2. 冒泡排序

    原理:
        -	比较相邻的元素。如果第一个比第二个大,就交换它们两个。
        -	对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
        -	针对所有的元素重复以上的步骤,除了最后一个。
        -	持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    
    名字由来:
        因最小(或最大)的元素会经由交换慢慢“浮”到数列的顶端(降序或升序),就如同水中的气泡最终会浮到水的顶端一样,故名“冒泡排序”。
    
    升序排列的口诀:
        N个数字来排队,
        两两相比小靠前。
        外层 循环length - 1,
    	内层 循环length - i - 1。
            
    降序排列的口诀:
        N个数字来排队,
        两两相比大靠前。
        外层 循环length - 1,
    	内层 循环length - i - 1

    示例:

    public class Demo5{
        
        /**
         *冒泡排序
         */
        public static void main(String[] args){
            int[] nums1 = {20,15,18,13,30,60};
            
            //外层循环控制的是比较的轮数。
            //外层循环次数:length - 1
            for(int i = 0;i < nums1.length - 1;i++){
                //内层循环控制的是每轮比较的次数。
                //第i轮(i从0开始计算),比较次数为:length - i - 1
                for(int j = 0;j < nums1.lenght - i - 1;j++){
                    if(nums1[j] > nums1[j + 1]){
                        //两两相比,满足移动条件(交换),小靠前
                        nums1[j] += nums1[j + 1];
                        nums1[j + 1] = nums1[j] - nums1[j + 1];
                        nums1[j] -= nums1[j + 1]; 
                    }
                }
            }
            //排序已经完成,以下是遍历打印查看的过程
            for(int i = 0;i < nums1.length;i++){
                System.out.print(nums1[i]);
            }
        }
    }
    
  3. 二分查找(折半查找)

    概述:

    	二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,/*二分查找要求数组数据必须采用顺序存储结构有序排列。*/
    

    原理:

    	首先,假设数组中元素是按升序排列,将数组中间位置的数据与查找数据比较,如果两者相等,则查找成功,否则利用中间位置记录将
    	数组分成前、后两个子数组,如果中间位置数据大于查找数据,则进一步查找前子数组,否则进一步查找后子数组。
    
    	重复以上过程,直到找到满足条件的数据,则表示查找成功。
    	直到子数组不存在为止,表示查找不成功。
    

    示例:

    public class Demo6{
        
        /**
         *二分查找(折半查找)
         */
        public static void main(String[] args){
            int[] nums = {10,20,30,40,50,60,70,80,90};
            //要查找的数据
            int num = 30;
            
            //关键的三个变量:
            //1. 最小范围下标
            int minIndex = 0;
            //2. 最大范围下标
            int maxIndex = nums.length;
            //3. 中间数据下标
            int centerIndex = (minIndex + maxIndex) / 2;
            while(true){
                if(nums[centerIndex] > num){
                    //中间数据较大 > num
                    maxIndex = centerIndex - 1;
                }else if(nums[centerIndex] < num){
                    //中间数据较小 < num
                    minIndex = centerIndex + 1;
                }else{
                    //找到了数据 数据位置:centerIndex
                    break;
                }
                if(minIndex > maxIndex){
                    //未找到数据
                    centerIndex = -1;
                    break;
                }
                //当边界发生变化,需要更新中间下标
                centerIndex = (minIndex + maxIndex) / 2;
            }
            if(centerIndex != -1){
                System.out.println("找到了" + num + "的数据,位于nums数组的第" + centerIndex + "个下标");
            }else{
                System.out.println("未找到" + num + "的数据");
            }
        }
    }
    /**
     *1. 确定查找的范围 最小~最大
     *
     *2. 计算中间的下标	(最小+最大)/ 2
     *
     *3. 比较中间下标数据,中间下标较大,则最大下标等于中间下标 - 1
     *	 比较中间小标数据,中间下标较小,则最小下标等于中间下标 + 1
     *
     *4. 当最小下标 > 最大小标时,说明数据是不存在的。
     */
    
4、多维数组(了解)
  1. 二维数组

    示例:

    public class Demo7{
        
        /**
         *多维数组(了解),因平时常用一、二维数组
         *
         *创建格式:
         *		数据类型[] 数组名称 = new 数据类型[长度];
         *		int[][] 二维数组名称 = new 数据类型[长度][];	//int[]:二维数组数据类型。
         */
        public static void main(String[] args){
            int[][] nums = new int[10][];
            nums[0] = new int[]{1,2,3};
            
            System.out.println(nums[0][2]);	//3
        }
    }
    
  2. 二维及以上的多维数组

    略。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值