java的数组/数组涉及的常见算法

 

 

 

public class Test2 {
    public static void main(String[] args) {
        int [] a = new int[3];//使用动态初始化的时候,数组的元素有默认值,数字类型的默认值0,对象类型为null
        System.out.println(a[2]);//结果为0
        System.out.println(a.length);//数组长度为3
    }
}

public class Test2 {
    public static void main(String[] args) {
        //一维数组中每一个元素都是一个数组,这样的数组就是二维数组
        int [][] two = new int[][] {//静态初始化
            {1,2},
            {3,4}
        };
        int[][] bwt = new int[2][3];//第一维部分的长度是2,第二维也就是第一维的每个元素的长度是3
        int[][] awe = new int[2][];//只定义第一维,第二维不定义,那么第二维就是空数组,通常这种定义适用于第二维长度不一样
        awe[0]=new int[3];//定义一维的第一个元素的长度为3
        awe[1]=new int[4];//定义一维的第二个元素的长度为4
        System.out.println(awe[1].length);//4
    }
}

 练习:获取arr二维数组中所有元素的和

public class Test2 {
    public static void main(String[] args) {
        int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}};//静态初始化
        int result = 0;//累加和
        for(int i = 0 ;i < arr.length ; i++) {//arr.length为一维长度
            for(int j = 0 ; j < arr[i].length ; j++) {//arr[i].length为每一个一维数组的长度
                result += arr[i][j];
            }
        }
        System.out.println(result);
    }
}

 总结:数组之间赋值,维度一定要相等,否则不通过。

 

//1.求数组元素的最大值、最小值、总和、平均数
            int a[] = new int[]{1,5,72,12,53,13,52,33,11};
            int max = a[0];//定义第一位是最大值
            for(int i = 0 ; i < a.length ; i++) {
                if(max < a[i]) {
                    max = a[i];
                }
            }
            System.out.println("max = "+max);
            //数组最小值
            int min = a[0];//定义第一位最小值
            for(int i = 0 ; i < a.length ; i++) {
                if(min > a[i]) {
                    min = a[i];
                }
            }
            System.out.println("min = "+min);
            //数组总和/平均数
            int count = 0 ; //定义累加
            int avg = 0;//平均数
            for(int i = 0 ; i < a.length ; i++) {
                count += a[i];
            }
            System.out.println("count = "+count);
            System.out.println("avg = "+(count/a.length));
View Code

    //2.数组的复制、反转 ,注意复制不是赋值,复制会新占用空间
            int arrs[] = new int[]{1,5,72,12,53,13,52,33};//原来的顺序
            int arr[] = new int[arrs.length];//arrs.length是上面arrs数组的长度
            for(int i = 0 ; i < arrs.length ; i++) {
                arr[i] = arrs[i];//把相同位置的元素赋值给新数组
            }
            //反转1
            int t = 0;//定义一个临时变量
            for(int i = 0 ; i < arrs.length/2 ; i++) {//反转只需要反转: 数组长度/2就行,因为2个数反转就算1次
                t = arrs[i];//首先数组第一个元素先赋值给一个临时变量
                arrs[i] = arrs[arrs.length-1-i];//然后把最后一位的元素赋值给第一个元素
                arrs[arrs.length-1-i] = t;//然后再把临时变量里面的第一个元素赋值给最后一个元素,完成反转
            }
            for(int i :arrs) {//增强循环打印反转后的数组
                System.out.print(i+" ");//33 52 13 53 12 72 5 1
            }
            System.out.println();
            //反转2  因为反转1已经反转过来 所以用了上面的arr复制数组
            int temp[] = new int[arr.length];//先定义一个临时数组
            for(int i =arr.length-1 ,k = 0 ; i >= 0 ; i--,k++) {//反序循环,k是临时数组的下标
                temp[k] = arr[i];
            }
            arr = temp;//循环结束后,把temp反序数组赋值给正序arrs数组
            for(int i :temp) {//增强循环打印反转后的数组
                System.out.print(i+" ");//33 52 13 53 12 72 5 1
            }
View Code

 

 这次就演示冒泡排序:

思路:

//4,7,3,1

//4,3,1,7第一轮得到一个最大的数字,放在倒数第一位

//3,1,4,7第二轮得到除最后一位数字之外的最大数字,放在倒数第二位

//1,3,4,7第三轮得到除最后两个数字之外的最大数字,放在倒数第三位

public class Test2 {
    public static void main(String[] args) {
        //3.数组元素的排序,冒泡排序
        int []arrs = new int[] {32,54,12,5};
        int t = 0 ; //临时变量
        for(int i = 0 ; i < arrs.length -1; i++) {//遍历数组的轮数,之所以-1是因为最后一轮后面没有数字可比了
            for(int j = 0 ; j < arrs.length -1 -i; j++) {//arrs.length-i-1,-1是因为下面已经j+1了,如果这里不减1,会数组越界,-i是每次比较完就减去比较的数量(简单的来说,前面第一位元素已经循环过一次放到了最后一位,不用再次循环,当然不用-i也是对的,不过会多循环几次)
                if(arrs[j]>arrs[j+1]) {//每循环一次当前元素于下一个元素比较,大的放后面位置
                    t = arrs[j];
                    arrs[j] = arrs[j+1];
                    arrs[j+1] = t;
                }
            }
        }
        for(int i : arrs) {//增强循环打印
            System.out.print(i+" ");//5 12 32 54
        }
    }
}
View Code

 

 练习:数组赋值和复制的区别

数组的赋值:

public class Test2 {
    public static void main(String[] args) {
        int array1[]= {2,3,5,7,11,13,17,19},array2[];//创建两个一位数组,并给数组1初始化
        System.out.println(Arrays.toString(array1));//打印数组1
        array2=array1;//把数组1赋值给数组2
        for(int i = 0 ; i < array2.length; i++) {//遍历数组2
            if(i % 2 == 0) {
                array2[i] = i; //把数组2的 偶  索修改位偶数  使其等于索引值
            }
        }
        System.out.println(Arrays.toString(array1));//打印数组1
        //发现修改了数组2的值,数组1的也会跟着改变
        //array1和array2的关系是:都为引用类型,当array1赋值给array2时,array2的堆内存指向了array1,因为两个数组指向了同一地址,如果值修改,两者都会有影响
    }
}
View Code

数组的复制:

public class Test2 {
    public static void main(String[] args) {
        int array1[]= {2,3,5,7,11,13,17,19},array2[] = new int[array1.length];//创建两个一位数组
        for(int i = 0 ; i < array1.length ; i++) {
            array2[i]=array1[i]; //遍历array1的值赋值给array2
        }
        for(int i = 0 ; i < array2.length; i++) {//遍历数组2
            if(i % 2 == 0) {
                array2[i] = i; //把数组2的 偶  索修改位偶数  使其等于索引值
            }
        }
        System.out.println(Arrays.toString(array1));//打印数组1
        System.out.println(Arrays.toString(array2));//打印数组2
        //发现修改了数组2的值,数组1的值没有发生改变
        //总结:数组1和数组2引用类型如果不是指向同一堆内存,那么修改其中一个数组不会对另外一个数组产生影响
    }
}
View Code

补充:如果不是很了解地址引用,可以去这里看看 java的地址:  Java内存机制和内存地址

猜你喜欢

转载自www.cnblogs.com/unlasting/p/12370393.html