冒泡排序
每次比较相邻的两个数,小的交换到前面,每轮结束最大的数交换到最后(我的理解就是双重循环,内循环控制最大数移到最后,外循环控制将每次循环杂乱无序的最大值从小到大进行排序,当然,不仅仅是升序排序,也可以降序)
用双重循环实现冒泡排序
用双重循环将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]);
}
}
}