二维数组

冒泡排序

每次比较相邻的两个数,小的交换到前面,每轮结束最大的数交换到最后(我的理解就是双重循环,内循环控制最大数移到最后,外循环控制将每次循环杂乱无序的最大值从小到大进行排序,当然,不仅仅是升序排序,也可以降序)

用双重循环实现冒泡排序
用双重循环将5个数字升序排序
5个数字如何存放:数组,数组.length = 5;
控制比较多少轮:外层循环变量i
控制每轮比较多少次:内层循环变量j
交换数据

冒泡排序速记口诀(升序)

N 个数字来排队
两两相比小靠前
外层循环 N-1
内层循环 N-1-I

//外循环控制比较多少轮
		for(int i=0;i<arr.length-1;i++){
			//控制每轮比较多少次
			//相邻的两个数在交换
			for(int j = 0;j<arr.length-1-i;j++){
				if(arr[j]>arr[j+1]){
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}

还有一种方式排序,并不是冒泡排序,但也有相应功能

		//arr[i]<arr[j]看似是将小的放在后面,其实运行到中间值的时候,后面的值都是小的了,
		//继续向后运行就是把将数字再次交换,所以运行到最后是从小变大,而不是从大变小
		//这样的双重循环并不是相邻两个进行比较交换,而是一个值与数组所有内容交换
		//并不属于冒泡排序
		for(int i =0;i<arr.length;i++){
			for(int j =0;j<arr.length;j++){
				if(arr[i]<arr[j]){
					int temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
		}
		System.out.println("排序后的数组是:");
		for(int i = 0;i<arr.length;i++){
			System.out.print(arr[i]+" ");
		}

练习1:冒泡排列学员成绩
使用冒泡排序对输入的5名学员成绩进行降序排列


import java.util.Scanner;

public class Demo4 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int arr[] = new int[5];
		for (int i = 0; i < arr.length; i++) {
			System.out.println("请输入5名同学的成绩:");
			arr[i] = input.nextInt();
		}
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = 0; j < arr.length - 1 - i; j++) {
				if (arr[j] < arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		System.out.println("学员成绩按降序排列:");
		for(int i:arr){
			System.out.print(i+" ");
		}
	}
}

除了冒泡排序法这种方法进行排序,还有一种更加快捷高效的排序方法

使用Arrays为数组排序

使用java.util.Arrays类:
-----java.util包提供的工具类
-----Arrays类提供操作数组的方法,如:排序、查询
-----Arrays类的sort()方法: 对数组进行升序排列
---------格式:Arrays.sort(数组名);

Arrays类

在这里插入图片描述
练习2:Arrays类排列字符
使用Arrays类升序排列一组字符,并查找某个特殊字符在升序后数组中的位置

import java.util.Arrays;	//注意千万别忘记导入Arrays工具包
							//调用方法Arrays.方法名();
public class Demo5 {
	public static void main(String[] args) {
		// 使用Arrays类升序排列一组字符,并查找某个特殊字符在升序后数组中的位置
		char[] c = { 'd', 'e', 'c', 'a', 'b' };
		System.out.println("目前数组为:");
		for (char a : c) {
			System.out.print(a + " ");
		}
		System.out.println();
		System.out.println("使用Arrays升序排列后数组为:");
		Arrays.sort(c);
		for (char a : c) {
			System.out.print(a+" ");
		}
		System.out.println();
		System.out.println("查找的c的下标为:\n"+Arrays.binarySearch(c,'c'));
	}
}

为什么学习多维数组

问题:要求对5个班各5名学生某门课程的成绩进行各种操作,如何实现?
分析思路:
---------1个班5名学生成绩
---------------长度为5的一维数组
---------5个班5名学生成绩
---------------5个长度为5的一维数组?

多维数组

三维及以上的数组很少使用
主要使用二维数组
从语法上Java支持多维数组
从内存分配原理的角度讲,只有一维数组

二维数组
语法格式:
数据类型 [][] 数组名;
数据类型 数组名 [][];

		int [][] arr ;
		arr = new int[5][50];
		
		int [][] scores = new int [5][50];

定义二维数组时,要定义最大维数

int [][] scores = new int [5][];

这样并不会报错

二维数组与内存2-1

int [][] s = new int[3][5];

在这里插入图片描述

二维数组与内存2-2

int [][] scores = new int[3][5];
scores[0][0] = 90;
scores[2][3] = 70;

在这里插入图片描述
二维数组定义

定义并赋值:
---------写法一:

int [][] scores = new int[][]{{1,2,3},{4,5,6},{7,8,9}};

---------写法二:

int [][] scores = {{1,2,3},{4,5,6},{7,8,9}};

遍历二维数组

有5个班各5名学生某门课程的成绩,如何计算5个班各自的总成绩

import java.util.Scanner;

public class Demo6 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int[][] scores = new int[5][5];
		// 需要通过遍历二维数组来获得输入的成绩
		for (int i = 0; i < scores.length; i++) {
			for (int j = 0; j < scores[i].length; j++) {
				System.out.println("请输入" + (i + 1) + "班的第"+(j+1)+"各学生的成绩:");
				scores[i][j] = input.nextInt();
			}
		}
		// 输出各班同学的成绩
		for (int i = 0; i < scores.length; i++) {
			System.out.println("第" + (i + 1) + "个班的各个学生的成绩为:");
			for (int j = 0; j < scores[i].length; j++) {
				System.out.print(scores[i][j]+" ");
			}
			System.out.println();
		}
		// 由于是五个班各自的总分,所以需要用一维数组来接受各自总分会比较方便
		int[] arr = new int[scores.length];
		// 继续遍历二维数组,将二维数组中的一维数组之和赋予arr
		for (int i = 0; i < scores.length; i++) {
			for (int j = 0; j < scores[i].length; j++) {
				arr[i] += scores[i][j];
			}
		}

		// 输出arr的值,就是五个班各自成绩之和
		for (int i = 0; i < arr.length; i++) {
			System.out.println("第" + (i + 1) + "个班的成绩总分为:" + arr[i]);
		}
	}
}

练习3:显示班级学生总成绩
已知有3个班级各5名学员,请使用二维数组计算各个班级的总成绩

import java.util.Scanner;

public class Demo6 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		//已知的三个班,每班五人,先声明二维数组,开辟空间用于接受
		int[][] scores = new int[3][5];
		// 需要通过遍历二维数组来获得输入的成绩
		for (int i = 0; i < scores.length; i++) {
			System.out.println("***********第"+(i+1)+"个班***********");
			for (int j = 0; j < scores[i].length; j++) {
				System.out.print("请输入第"+(j+1)+"个学生的成绩:");
				scores[i][j] = input.nextInt();
			}
		}
		// 输出各班同学的成绩
		for (int i = 0; i < scores.length; i++) {
			System.out.println("第" + (i + 1) + "个班的各个学生的成绩为:");
			for (int j = 0; j < scores[i].length; j++) {
				System.out.print(scores[i][j]+"\t");
			}
			System.out.println();
		}
		// 由于是三个班各自的总分,所以需要用一维数组来接受各自总分会比较方便
		int[] arr = new int[scores.length];
		// 继续遍历二维数组,将二维数组中的一维数组之和赋予arr
		for (int i = 0; i < scores.length; i++) {
			for (int j = 0; j < scores[i].length; j++) {
				arr[i] += scores[i][j];
			}
		}
		// 输出arr的值,就是五个班各自成绩之和
		for (int i = 0; i < arr.length; i++) {
			System.out.println("第" + (i + 1) + "个班的成绩总分为:" + arr[i]);
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值