第4章-第3节-Java中跟数组相关的几个算法以及综合应用

发布时间:2023年12月20日

在写这篇博文之前,先大概说明一下,就是很常见的数组算法如求最大值、一维数组的遍历等,这里就不去专门说明了,只说一些有代表性的,然后就是冒泡排序算法很容易查阅到,这里也不专门说明了,只说明一个较冒泡难理解一点点的选择排序,最后再说一下,就是这些算法都是练习自己的思维能力,其实有些功能如果你不想做,可以直接用java.util.Arrays这个类库就可以达到效果。

1、一维数组的反转问题:已知数组为arr;

方法1:首尾对换(推荐采用异或去进行交换,具体方法查看我C语言专栏里的博文);

for(int i = 0; i < arr.length / 2; i++){
	int temp = arr[i];
	arr[i] = arr[arr.length - 1 - i];
	arr[arr.length - 1 - i] = temp;
}

方法2:定义两个起点(左端起点、右端起点);

for(int i = 0,j = arr.length - 1; i < j; i++,j--){
	int temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}

方法3:创建一个新数组,把原数据倒序输入到新数组;

int[] newArr = new int[arr.length];
for(int i = arr.length - 1,j = 0; i >= 0; i--,j++){
	newArr[j] = arr[i];
}

2、选择排序升序:(推荐采用异或去进行交换,具体方法查看我C语言专栏里的博文)

//外层循环控制轮数,此处的i可以认为是选中空间
for(int i = 0;i <= arr.length - 2;i++){
	//内层循环控制每一轮执行的次数,此处的j可以认为是比较空间
	for(int j = i + 1;j <= arr.length - 1;j++){
		if(arr[i] > arr[j]){
			int temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
		}
	}
}

选择排序大概思路:拿升序作例子,从0元素开始,把它分别和后面的元素去对比,如果0元素大于它,那么就去交换,0元素做一轮下来,最小的数就会在0元素位置了,接着第二轮从1元素开始,把它分别和后面的元素去对比,如果1元素大于它,那么就去交换,这一轮做完那么第二小的数会在1元素位置,依次类推,一直做下去,最后实现上就是外层循环为选中的某一个位置的元素,然后内循环就是拿这个位置的元素去和它后面所有的数去对比,最后根据大小进行处理。

3、常规应用:

1)、打印如下的效果
? ? ? ? ? ?11111
? ? ? ? ? ?22222
? ? ? ? ???33333
? ? ? ? ? ?44444
? ? ? ? ? ?55555

//创建二维数组对象	5行5列
int[][] arr = new int[5][5];
//循环操作
//外层循环控制行数/轮数	==>	理解:锁定/定位到每一个一维数组
for(int i = 0;i <= arr.length - 1;i++){
	//内层循环控制每一行的列数 ==> 理解:定位当前一维数组的每个元素
	for(int j = 0;j <= arr[i].length - 1;j++){
		//为当前一维数组的每个元素显示赋值
		arr[i][j] = i + 1;
		//获取当前一维数组的每个元素,打印看效果
		System.out.print(arr[i][j]);
	}
	//单独换行
	System.out.println();
}

2)、打印如下的效果
?? ??? ??? ?1
?? ??? ??? ?22
?? ??? ??? ?333
?? ??? ??? ?4444
?? ??? ??? ?55555

//创建二维数组对象	5行
int[][] arr = new int[5][];
//循环创建5个一维数组对象,将地址关联到二维数组元素位置
for(int i = 0;i <= arr.length - 1;i++){
	arr[i] = new int[i + 1];
	//循环操作 => 为当前一维数组的每个元素显示赋值&当前元素内容
	for(int j = 0;j <= arr[i].length - 1;j++){
		arr[i][j] = i + 1;
		System.out.print(arr[i][j]);
	}
	System.out.println();
}

这个例子只是其中一个,我对打印数字三角形也进行了汇总,看我写的这篇博文:关于在Java中打印“数字”三角形图形的汇总?

3)、综合应用:

import java.util.Random;
import java.util.Scanner;

/**
 * 需求:保存全班的每个组的成绩,并对成绩做统计
 *
 * 1. 从键盘输入一共有几组
 * 2. 从键盘输入每一组分别有多少人
 * 3. 随机生成每名学生成绩(这样避免手动输入太多,其实最后程序效果一样)
 * 4. 统计每一组的最高分、最低分
 * 5. 统计每一组的平均分
 * 6. 统计全班的最高分、最低分
 * 7. 统计全班的平均分
 * 8. 统计全班的总人数
 */
public class Work {
    public static void main(String[] args) {
        int[][] array = getArray();
        System.out.println("--------------------------------------------------------------------------------------------");
        groupScore(array);
        allScore(array);
    }
    //处理1、2、3
    public static int[][] getArray(){
        Random r = new Random();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一共有多少组:");
        int groupNum = sc.nextInt();
        while (groupNum < 1) {
            System.out.println("输入有误,重新输入一共有多少组:");
            groupNum = sc.nextInt();
        }

        int[][] arr = new int[groupNum][];
        for (int i = 0; i < groupNum; i++) {
            System.out.println("请输入第" + (i + 1) + "组有多少人:");
            int peopleNum = sc.nextInt();
            while (peopleNum < 1) {
                System.out.println("输入有误,重新输入第" + (i + 1) + "组有多少人:");
                peopleNum = sc.nextInt();
            }
            arr[i] = new int[peopleNum];
            for (int j = 0; j < peopleNum; j++) {
                arr[i][j] = r.nextInt(100) + 1;
            }
        }
        sc.close();

        for (int i = 0; i < arr.length; i++) {
            System.out.print("第" + (i + 1) + "组:");
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print("第" + (j + 1) + "人成绩=" + arr[i][j] + "\t");
            }
            System.out.println();
        }
        return arr;
    }

    //处理4、5
    public static void groupScore(int[][] arr) {
        for (int i = 0; i < arr.length; i++) {
            int max = arr[i][0];
            int min = arr[i][0];
            int sum = 0;
            for (int j = 1; j < arr[i].length; j++) {

                if (arr[i][j] > max) {
                    max = arr[i][j];
                }
                if (arr[i][j] < min) {
                    min = arr[i][j];
                }
                sum += arr[i][j];
            }
            System.out.println("第" + (i + 1) + "组最高分为:" + max + ",最低分为:" + min + ",平均分为:" + (sum / arr[i].length));
        }
    }

    //处理6、7、8
    public static void allScore(int[][] arr) {
        int max = arr[0][0];
        int min = arr[0][0];
        int sum = 0;
        int peopleNum = 0;
        for (int i = 0; i < arr.length; i++) {
            peopleNum += arr[i].length;
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] > max) {
                    max = arr[i][j];
                }
                if (arr[i][j] < min) {
                    min = arr[i][j];
                }
                sum += arr[i][j];
            }
        }
        System.out.println("全班人数为:" + peopleNum + ",最高分为:" + max + ",最低分为:" + min + ",平均分为:" + (sum / peopleNum));
    }
}

备注:关于二维数组的综合应用,我还做了一个Java版五子棋游戏的案例(感兴趣的可以看看,我写的这个五子棋案例对提高思维能力很有帮助):Java语言+二维数组+非递归实现五子棋游戏?

本电子书目录:《Java基础的重点知识点全集》

文章来源:https://blog.csdn.net/jnbbwyth/article/details/135038094
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。