2025年31-Java数组案例:求最值、猜数字...

31-Java数组案例:求最值、猜数字...一 数组案例 数组求最值 数组元素求最大值 需求 挑出颜值最高的美女 思路 首先 这个业务属于一开始就能确定元素值的 所以使用静态化数组来存放这些颜值元素 然后 需要定义一个最大值变量 记录第一位上场美女颜值 用于与后一位上场美女的颜值进行比较

大家好,我是讯享网,很高兴认识大家。

一、数组案例:数组求最值

  • 数组元素求最大值

在这里插入图片描述
讯享网

  • 需求:挑出颜值最高的美女
  • 思路:
    • 首先,这个业务属于一开始就能确定元素值的,所以使用静态化数组来存放这些颜值元素
    • 然后,需要定义一个最大值变量,记录第一位上场美女颜值,用于与后一位上场美女的颜值进行比较
    • 再然后,使用for循环遍历:一个一个的把美女的颜值访问
    • 之后,使用if进行判断:后一位上场美女的颜值 是否大于 第一位上场美女的颜值,是就把第一位淘汰,把最大值变量的值替换成后一位上场美女的颜值;不是就没有资格比较,有请下一位
  • 分析需求:
    1. 定义一个int类型的静态初始化数组,存放美女的颜值
    2. 在循环外定义一个最大值变量,用于记录最大值,变量建议默认存储数组中第一个元素值作为参照,因为要进行元素比较,所以默认值不能是 0
    3. 使用for循环来遍历每个美女的颜值
    4. 在循环内,使用if判断:每次遍历到的颜值 是否大于 记录的最大值,是则替换最大值;不是就不进入if判断,有请下一位
    5. 将最高颜值输出到控制台
package com.app.traverse; public class ArrayTest3 { 
    public static void main(String[] args) { 
    // 目标:通过数组案例:数组求最值,更深的掌握数组的应用 以及 遍历的灵活运用 /* - 需求:挑出颜值最高的美女,颜值:15,9000,10000,20000,9500,-5 - 思路: - 首先,这个业务属于一开始就能确定元素值的,所以使用静态化数组来存放这些颜值元素 - 然后,需要定义一个最大值变量,记录第一位上场美女颜值,用于与下一位上场美女的颜值进行比较 - 再然后,使用for循环遍历:一个一个的把美女的颜值访问 - 之后,使用if进行比较:下一位上场美女的颜值 是否大于 第一位上场美女的颜值, 是就把第一位淘汰,替换成下一位上场美女的颜值, 不是就没有比较的必要,直接下一位上来比较 - 具体实现: 1. 定义一个int类型的数组,存放美女的颜值 2. 在循环外定义一个最大值变量,用于记录最大值, 变量建议默认存储数组中第一个元素值作为参照,因为要进行元素比较,所以默认值不能是 0 3. 使用for循环来遍历每个美女的颜值 4. 在循环内,使用if判断: 每次遍历到的颜值 是否大于 记录的最大值, 是则替换最大值, 不是就不进入if判断,没有判断的必要,所以有请下一位 5. 将最高颜值输出到控制台 */ // 1. 定义一个int类型的数组,存放美女的颜值 int[] faceValue = { 
   15, 9000, 10000, 20000, 9500, -5}; // 0 1 2 3 4 5 // 2. 在循环外定义一个最大值变量,用于记录最大值, // 变量建议默认存储数组中第一个元素值作为参照,因为要进行元素比较,所以默认值不能是 0 int max = faceValue[0]; // 3. 使用for循环来遍历每个美女的颜值 // 因为最大值选择了第一个美女,如果 i = 0,就会 第一个美女 和 第一个美女 作比较,不符合实际,显得多此一举 // 所以,i = 1,就会 第二个美女 和 第一个美女 作比较,符合实际,显得更专业,优雅 for (int i = 1; i < faceValue.length; i++) { 
    // 4. 在循环内,使用if判断: if (faceValue[i] > max){ 
    // 每次遍历到的颜值 是否大于 记录的最大值, // 是则替换最大值,不是就不进入if判断,没有判断的必要,所以有请下一位 max = faceValue[i]; } } // 5.挑出最高颜值的美女后输出 System.out.println("最高颜值:" + max); } } 

讯享网
讯享网输出结果: 最高颜值:20000 
数组求最值总结

1、数组元素求最大值如何实现的?

  • 首先,看业务一开始给不给确定元素值,给就用静态初始化数组,不给就用动态初始化数组,后期赋值
  • 1.定义一个数组存放元素值
  • 2.定义一个最大值变量,用于记录最大值(该变量建议存储数组中的第一个元素作为参照,方便与后面的每一位元素进行比较)
  • 3.使用for循环遍历数组中的每一个元素值
  • 3-1.在循环内使用if判断:后面的每一位元素 是否大于 记录最大值,如果是,就替换最大值为该元素;如果不是,就不进入if判读,进行下一轮循环比较,直到数组中所有元素比完,循环才结束
  • 4.输出最大值

二、数组案例:猜数字游戏

  • 需求:开发一个幸运小游戏,游戏规则如下:
    • 游戏后台随机生成1~20之间的5个数(无所谓是否重复),然后让大家来猜数字:
      • 未猜中提示:“未命中”,并继续猜测
      • 猜中提示:“运气不错,猜中了”,并输出该数据第一次出现的位置,且输出全部5个数据,最终结束本游戏。
  • 分析:
    • 首先可以确定的是,这个业务属于开始不能确定元素值,所以使用动态初始化数组来存储这些幸运数,后期再赋值
    • 1、定义一个动态初始化数组,用于存储5个1-20之间的随机幸运数
    • 2、使用for循环,动态的生成5个1-20之间的随机幸运数
    • 3、在for循环外,创建随机数Random对象类,用于生成随机幸运数
    • (3-1) 在for循环内,调用随机数功能生成5个1-20之间的随机幸运数,并赋值给动态初始化数组
    • 4、先输入 OUT: ——> 为后面结束整个死循环做铺垫
    • 5、使用while循环,定义一个死循环,用于让大家可以不断的猜幸运数,猜中就结束死循环,猜不中继续猜
    • 6、在死循环外,创建键盘录入Scanner对象类,用于让大家猜幸运数
    • (6-1) 在死循环内,提示大家开始猜幸运数(1-20),定义一个变量用于接收大家猜的幸运数——>用于后面与数组中正确的幸运数作比较
    • (6-2) 在死循环内,使用for循环遍历——>将数组中全部正确的幸运数都访问一遍,用于后面与大家猜的幸运数作比较
    • (6-3) 在死循环内的for循环内,使用if判断:大家猜的幸运数 是否 在数组中。在则提示:“运气不错,猜中了!”,并输出该幸运数第一次出现的位置(索引),并且使用 break OUT; ——>用于结束整个死循环。
    • 7、在for循环外,假如:大家猜的幸运数 不在 数组中,则提示:“未命中!”
    • 8、游戏结束后,使用for循环遍历,输出数组中所有正确的幸运数
package com.app.traverse; // 1.导入包:Scanner键盘输入、Random随机数 ————>在创建这两个对象类时会自动导包 import java.util.Random; import java.util.Scanner; public class ArrayTest4 { 
    public static void main(String[] args) { 
    // 目标:通过数组案例:猜数字游戏,更深入的结合数组来解决开发业务问题 /* 一、需求:开发一个幸运小游戏,游戏规则如下: - 游戏后台随机生成1~20之间的5个数(无所谓是否重复),然后让大家来猜数字: - 未猜中提示:“未命中”,并继续猜测 - 猜中提示:“运气不错,猜中了”,并输出该数据第一次出现的位置,且输出全部5个数据,最终结束本游戏。 */ // 1、定义一个动态初始化数组,用于存储5个1-20之间的随机幸运数 int[] luckyNumber = new int[5]; // [0,0,0,0,0] // 索引 0 1 2 3 4 // 3、在for循环外,创建随机数Random对象类,用于生成随机幸运数 Random rd = new Random(); // 2、使用for循环,动态的生成5个1-20之间的随机幸运数 for (int i = 0; i < luckyNumber.length; i++) { 
    // (3-1) 在for循环内,调用随机数功能生成5个1-20之间的随机幸运数,并赋值给动态初始化数组 // i = 0 1 2 3 4 luckyNumber[i] = rd.nextInt(1,21); } // 6、在死循环外,创建键盘录入Scanner对象类,用于让大家猜幸运数 Scanner sc = new Scanner(System.in); // 4、先输入 OUT: ——> 为后面结束整个死循环做铺垫 OUT: // 5、使用while循环,定义一个死循环,用于让大家可以不断的猜幸运数,猜中就结束死循环,猜不中继续猜 while (true) { 
    // (6-1) 在死循环内,提示大家开始猜幸运数(1-20), // 定义一个变量用于接收大家猜的幸运数——>用于后面与数组中正确的幸运数作比较 System.out.println("请您开始猜5个幸运数(1-20):"); int guessNumber = sc.nextInt(); // (6-2) 在死循环内,使用for循环遍历——>将数组中全部正确的幸运数都访问一遍, // 用于后面与大家猜的幸运数作比较 for (int i = 0; i < luckyNumber.length; i++) { 
    // (6-3) 在死循环的for循环内,使用if判断:大家猜的幸运数 是否 在数组中 if (guessNumber == luckyNumber[i]) { 
    // 在则提示:"运气不错,猜中了!",并输出该幸运数第一次出现的位置(索引), System.out.println("运气不错!猜中了!快去换领奖品吧~~"); System.out.println("您猜中的幸运数第一次出现的位置是:" + i); // 并且使用 break OUT; ——>用于结束整个死循环 break OUT; } } // 7、在for循环外,假如:大家猜的幸运数 不在 数组中,则提示:"未命中!" System.out.println("未猜中!继续加油~~"); } // 8、游戏结束后,使用for循环遍历,输出数组中所有正确的幸运数 System.out.println("\n全部随机幸运数:"); for (int i = 0; i < luckyNumber.length; i++) { 
    System.out.print(luckyNumber[i] + "\t"); } } } 
讯享网输出结果: 请您开始猜5个幸运数(1-20): 1 未猜中!继续加油~~ 请您开始猜5个幸运数(1-20): 2 未猜中!继续加油~~ 请您开始猜5个幸运数(1-20): 3 未猜中!继续加油~~ 请您开始猜5个幸运数(1-20): 4 未猜中!继续加油~~ 请您开始猜5个幸运数(1-20): 5 运气不错!猜中了!快去换领奖品吧~~ 您猜中的幸运数第一次出现的位置是:3 全部随机幸运数: 13 12 19 5 9 
猜数字游戏总结

1、猜数字游戏的实现步骤?

  • 首先,先看一开始能不能确定元素值,不能则使用动态初始化数组,后期赋值;能则使用静态初始化数组
  • 1.定义一个动态初始化数组,后期动态赋值
  • 2.使用for循环遍历,用于动态赋值给数组
  • 3.在for循环外,创建Random随机数对象,用于生成随机数
  • 3-1.在循环内,调用随机数功能生成随机数,赋值给数组
  • 4.使用OUT: ——>用于为后面结束整个死循环做铺垫
  • 5.使用while循环定义一个死循环,让大家猜数字
  • 6.在死循环外,创建Scanner键盘录入对象类,用于让大家猜数
  • 6-1.在死循环内,提示:让大家开始猜数,并定义一个变量用于接收大家猜的数
  • 6-2.在死循环内,使用for循环遍历数组中的随机数
  • 6-3.在死循环内的for循环内,使用if判断:大家猜的数 是否 在数组中,在则提示:“恭喜猜中了!”,并输出猜中的数的第一次出现的索引位置,并使用 break OUT; ——>用于结束整个死循环(结束猜数字游戏)
  • 7.在死循环内,for循环外,假如:大家猜的数 不在 数组中,则提示:“未猜中!继续加油~~”,继续猜数
  • 8.当结束猜数字游戏后,使用for循环遍历整个数组的随机数,输出出来

三、数组案例:随机排名

  • 需求:
    • 某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。
    • 请先依次录入5名员工的工号,然后展示出一组随机的排名顺序

在这里插入图片描述

  • 分析:
    • 首先,这个业务属于一开始就能确定元素值,虽然说可以用静态初始化数组,但是还是推荐用动态初始化数组,因为比较灵活,静态的话,写死了,非常不方便
    • 1.定义一个动态初始化数组,长度为5,用于存储5名员工的工号,后期赋值
    • 2.定义一个for循环,循环5次,依次录入一个工号存入对应的位置
    • 3.在for循环外,创建Scanner键盘录入对象类,用于录入员工工号
    • (3-1) 在for循环内,提示:录入工号,并定义一个变量来存放录入的员工工号
    • (3-2) 将录入的工号赋值给数组
    • 4.定义一个循环,遍历数组的每一个员工的工号
    • 5.在循环外,创建Random随机数对象类,用于生成一个随机索引 与 员工的工号 进行位置交换
    • (5-1) 在循环内,调用随机数功能生成1个1-5之间的随机索引位置,用一个变量存放起来
    • (5-2) 在循环内,进行员工工号的交换操作:
      (1) 先用临时变量将 随机索引位置的B员工工号存起来; (2) 再将当前A员工工号 赋值到 随机索引的位置; (3) 最后再将临时变量里的B员工工号 赋值到 A员工工号的索引位置; (4) 形成位置交换,达成随机排名 
    • 思路:
      讯享网(1) 首先不能直接将 A员工工号 直接赋值给 随机的索引位置的B员工工号,不然随机的索引位置的B员工工号就会被覆盖掉,那就不是交换了,而是谋杀; (2) 需要用一个临时变量将 随机的索引位置的B员工工号存放起来,相当于拷贝一份,然后在 将A员工工号 赋值给 随机的索引位置后,再将 B员工工号 赋值给 A员工工号,形成了工号交换操作。 
    • 如果这里大家看不明白上面思路的话,请看下图:
      在这里插入图片描述
      在这里插入图片描述
    • 6.在for循环完成交换后,使用for循环遍历数组,展示出一组随机排名的顺序工号
package com.app.demo; // 导包:创建对象类时,IDEA工具会自动导入 import java.util.Random; import java.util.Scanner; public class Test4 { 
    public static void main(String[] args) { 
    // 目标:通过数组案例:随机排名,更深入的结合数组来解决开发业务中的问题 /* 一、需求: - 某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。 - 请先依次录入5名员工的工号,然后展示出一组随机的排名顺序 22 33 35 13 88 ————> 13 35 88 33 22 */ // 1.定义一个动态初始化数组,长度为5,用于直接存储5名员工的工号,后期赋值 int[] staffIds = new int[5]; // 3.在for循环外,创建Scanner键盘录入对象类,用于录入员工工号 Scanner sc = new Scanner(System.in); // 在循环外定义一个计数器,用于记录员工数量(用于最终结果输出的美观感) int count = 0; // 2.定义一个for循环,循环5次,依次录入一个工号存入对应的位置 for (int i = 0; i < staffIds.length; i++) { 
    // (3-1) 在for循环内,提示:录入工号,并定义一个变量来存放录入的员工工号 System.out.println("请录入第" + (i+1) + "个员工的工号:"); int staffId = sc.nextInt(); // (3-2)将录入的工号赋值给数组 staffIds[i] = staffId; // 累加员工数量 count++; } // 以下是本次案例的重点: // 5.在循环外,创建Random随机数对象类,用于生成一个随机索引 与 员工的工号 进行位置交换 Random rd = new Random(); // 4.定义一个循环,遍历数组的每一个员工的工号 for (int i = 0; i < staffIds.length; i++) { 
    // (5-1) 在循环内,调用随机数功能生成1个 1-5之间 的随机索引位置,用一个变量存放起来 int index = rd.nextInt(staffIds.length); // (5-2) 在循环内,进行员工工号的交换操作: // 当前A员工工号:staffIds[i] // 随机索引位置的B员工工号:staffIds[index] // 先用临时变量将 随机索引位置的B员工工号存起来; int temp = staffIds[index]; // 再将当前A员工工号 赋值到 随机索引的位置 staffIds[index] = staffIds[i]; // 最后再把 B员工工号 赋值给 A员工工号的索引位置 staffIds[i] = temp; } // 6.在for循环完成交换后,使用for循环遍历数组,展示出一组随机排名的顺序工号 System.out.println("\n" + count + "名员工的工号随机排名顺序:"); for (int i = 0; i < staffIds.length; i++) { 
    System.out.print(staffIds[i] + "\t"); } } } 
讯享网输出结果: 请录入第1个员工的工号: 22 请录入第2个员工的工号: 33 请录入第3个员工的工号: 35 请录入第4个员工的工号: 13 请录入第5个员工的工号: 88 开发部5名员工的工号随机排名顺序: 88 33 22 35 13 
随机交换排名的其他使用场景:比如斗地主洗牌
随机排名总结

1、如何实现随机排名?

  • 1、先定义一个动态初始化的数组,用于存储录入的数据

    // 1 int[] codes = new int[5]; 
  • 2、使用循环遍历数组,动态的将数据录入数组中
    讯享网// 1 int[] codes = new int[5]; // 2 for (int i = 0; i < codes.length; i++) { 
          } 
  • 3、在循环前,创建Scanner键盘录入对象类,用于录入数据
    // 1 int[] codes = new int[5]; // 3 Scanner sc = new Scanner(System.in); // 2 for (int i = 0; i < codes.length; i++) { 
          } 
  • (3-1) 在循环内,提示:开始录入数据,用一个变量接收这个录入的数据
    讯享网// 1 int[] codes = new int[5]; // 3 Scanner sc = new Scanner(System.in); // 2 for (int i = 0; i < codes.length; i++) { 
          // (3-1) System.out.println("请录入第" + (i+1) + "个员工的工号:"); int code = sc.nextInt(); } 
  • (3-2) 在循环内,将每一次录入的数据,赋值给数组
    // 1 int[] codes = new int[5]; // 3 Scanner sc = new Scanner(System.in); // 2 for (int i = 0; i < codes.length; i++) { 
          // (3-1) System.out.println("请录入第" + (i+1) + "个员工的工号:"); int code = sc.nextInt(); // (3-2) codes[i] = code; } 
  • 4、使用循环遍历数组,用于 与 随机得到的一个索引位置 进行位置交换
    讯享网// 1 int[] codes = new int[5]; // 3 Scanner sc = new Scanner(System.in); // 2 for (int i = 0; i < codes.length; i++) { 
          // (3-1) System.out.println("请录入第" + (i+1) + "个员工的工号:"); int code = sc.nextInt(); // (3-2) codes[i] = code; } // 4 for (int i = 0; i < codes.length; i++) { 
          } 
  • 5、在循环前,创建Random随机数对象类,用于随机得到一个索引位置
    // 1 int[] codes = new int[5]; // 3 Scanner sc = new Scanner(System.in); // 2 for (int i = 0; i < codes.length; i++) { 
          // (3-1) System.out.println("请录入第" + (i+1) + "个员工的工号:"); int code = sc.nextInt(); // (3-2) codes[i] = code; } // 5 Random rd = new Random(); // 4 for (int i = 0; i < codes.length; i++) { 
          } 
  • (5-1) 在循环内,调用随机数功能随机得到1个 小于数组长度的 索引位置,用一个变量接收这个随机得到的索引位置
    讯享网// 1 int[] codes = new int[5]; // 3 Scanner sc = new Scanner(System.in); // 2 for (int i = 0; i < codes.length; i++) { 
          // (3-1) System.out.println("请录入第" + (i+1) + "个员工的工号:"); int code = sc.nextInt(); // (3-2) codes[i] = code; } // 5 Random rd = new Random(); // 4 for (int i = 0; i < codes.length; i++) { 
          // (5-1) int index = rd.nextInt(codes.length); } 
  • (5-2) 在循环内,将 随机得到的索引位置 用一个临时变量存储起来
    // 1 int[] codes = new int[5]; // 3 Scanner sc = new Scanner(System.in); // 2 for (int i = 0; i < codes.length; i++) { 
          // (3-1) System.out.println("请录入第" + (i+1) + "个员工的工号:"); int code = sc.nextInt(); // (3-2) codes[i] = code; } // 5 Random rd = new Random(); // 4 for (int i = 0; i < codes.length; i++) { 
          // (5-1) int index = rd.nextInt(codes.length); // (5-2) int temp = codes[index]; } 
  • (5-3) 在循环内,将 每一次从数组中遍历出来的数据 赋值到 随机得到的索引位置
    讯享网// 1 int[] codes = new int[5]; // 3 Scanner sc = new Scanner(System.in); // 2 for (int i = 0; i < codes.length; i++) { 
          // (3-1) System.out.println("请录入第" + (i+1) + "个员工的工号:"); int code = sc.nextInt(); // (3-2) codes[i] = code; } // 5 Random rd = new Random(); // 4 for (int i = 0; i < codes.length; i++) { 
          // (5-1) int index = rd.nextInt(codes.length); // (5-2) int temp = codes[index]; // (5-3) codes[index] = codes[i] } 
  • (5-4) 在循环内,将 临时变量里存储的随机得到的索引位置 赋值到 每一次从数组中遍历出来的数据的索引位置
    // 1 int[] codes = new int[5]; // 3 Scanner sc = new Scanner(System.in); // 2 for (int i = 0; i < codes.length; i++) { 
          // (3-1) System.out.println("请录入第" + (i+1) + "个员工的工号:"); int code = sc.nextInt(); // (3-2) codes[i] = code; } // 5 Random rd = new Random(); // 4 for (int i = 0; i < codes.length; i++) { 
          // (5-1) int index = rd.nextInt(codes.length); // (5-2) int temp = codes[index]; // (5-3) codes[index] = codes[i] // (5-4) codes[i] = temp; } 
  • 6、在这些数据完成交换后,在循环后,使用for循环重新遍历一遍数组,输出随机排名的顺序
    讯享网// 1 int[] codes = new int[5]; // 3 Scanner sc = new Scanner(System.in); // 2 for (int i = 0; i < codes.length; i++) { 
          // (3-1) System.out.println("请录入第" + (i+1) + "个员工的工号:"); int code = sc.nextInt(); // (3-2) codes[i] = code; } // 5 Random rd = new Random(); // 4 for (int i = 0; i < codes.length; i++) { 
          // (5-1) int index = rd.nextInt(codes.length); // (5-2) int temp = codes[index]; // (5-3) codes[index] = codes[i] // (5-4) codes[i] = temp; } // 6 System.out.println("员工工号的随机排名顺序:"); for (int i = 0; i < codes.length; i++) { 
          System.out.print(codes[i] + "\t"); } 

四、数组案例:数组排序

  • 就是对数组中的元素,进行升序(由小到大) 或者 降序(由大到小) 的操作。
1、数组排序的技术
  • 冒泡排序
  • 选择排序
  • 快速排序
  • 插入排序
2、数组搜索相关的技术
  • 二分搜索
  • 分块查找
  • 哈希表查找
3、目前重点讲冒泡排序
  • 预预热,其他的后面再学,毕竟这是属于算法的,得慢慢来
4、冒泡排序的思想
  • 每次从数组中找出最大值放在数组的后面去
5、冒泡排序的原理

在这里插入图片描述

6、实现冒泡排序的关键步骤分析
  • 确定总共需要做几轮:数组的长度 - 1(因为,假如一个数组里有4个数据,那我4-1,做3轮,做完3轮,剩下的最后1个数据是不是已经是最小的了?所以,总共需要做:数组长度-1 轮)
  • 每轮比较几次:
    i(轮数) 次数 次数规律:数组长度 - i - 1 0 3 4-0-1 = 3次 1 2 4-1-1 = 2次 2 1 4-2-1 = 1次 
  • 一、需求
    • 将 5 2 3 1,使用冒泡排序来完成升序
  • 二、分析
    • 1.定义一个静态初始化数组,存储这些数据
    • 2.定义一个外部循环控制比较的轮数:确定总共需要做几轮:数组的长度 - 1
    • 3.定义一个内部循环控制比较的次数——>占位,确定总共需要做几次:数组长度 - 轮数 - 1
    • (3-1) 在内部循环内,使用if判断:当前占位的数据 是否 大于后一个位置的数据 若较大 ,则进行位置交换
      讯享网(1)先用临时变量将后一个位置的数据存起来,以免被 当前占位的数据 覆盖掉; (2)将 当前占位的数据 赋值到 后一个位置,java中赋值都是从右往左; (3)将 后一个位置的数据 赋值到 当前占位的数据的位置 
    • 4、将排序后的数组进行遍历后输出
    package com.app.demo; public class Test5 { 
          public static void main(String[] args) { 
          // 目标:学会使用冒泡排序对数据进行升序排序 /* - 需求: 将 5 2 3 1,使用冒泡排序来完成升序 */ // 1.定义一个静态初始化数组,存储这些数据 int[] numbers = { 
         5, 2, 3, 1}; // 索引 0 1 2 3 // 排序前,用于输出后,做对比 System.out.print("排序前:"); for (int i = 0; i < numbers.length; i++) { 
          System.out.print(numbers[i] + " "); } // 以下是冒泡排序的重点: // 2.定义一个外部循环控制比较的轮数: 确定总共需要做几轮:数组的长度 - 1 for (int i = 0; i < numbers.length -1; i++) { 
          // 3.定义一个内部循环控制比较的次数——>占位,确定总共需要做几次: 数组长度 - 轮数 - 1 for (int j = 0; j < numbers.length - i - 1; j++) { 
          // (3-1) 在内部循环内,使用if判断: if (numbers[j] > numbers[j+1]) { 
          // 当前占位的数据 是否 大于后一个位置的数据 若较大, // 则进行位置交换 // 先用临时变量将后一个位置的数据存起来,以免被 当前占位的数据 覆盖掉 int temp = numbers[j+1]; // 将 当前占位的数据 赋值到 后一个位置,java中赋值都是从右往左 numbers[j+1] = numbers[j]; // 将 后一个位置的数据 赋值到 当前占位的数据的位置 numbers[j] = temp; } } } // 4.将排序后的数组进行遍历后输出 System.out.print("\n排序后:"); for (int i = 0; i < numbers.length; i++) { 
          System.out.print(numbers[i] + " "); } /* 冒泡排序的重点执行流程: 数组数据: 5 2 3 1 -------------------------------- 索引: 0 1 2 3 1.开始进入外部for循环——>负责控制轮数: 第一轮: i = 0, 因此 i < (4-1=3), 为true,进入下一层代码... 第一次比较: j = 0, 因此 j < (4-i-1) 等价于 j < (4-0-1), 为true, 开始进入if判断... 判断: j = 0, 因此当前 0 索引位置的数据是: 5, 与后一位数据 j+1(等价于: 0+1 = 1), 因此 1 索引 位置的数据是: 2; 所以: 5>2, 此次比较的最大值是: 5, 为true, 5 和 2 正在交换位置... 因此数组数据变成: 2 5 3 1, 进入j++... 索引: 0 1 2 3 ---------------------------------------------------------------------------------------- 第二次比较: j = 1, 因此 j < (4-i-1) 等价于 j < (4-0-1), 为true, 开始进入if判断... 判断: j = 1, 因此当前 1 索引位置的数据是: 5, 与后一位数据 j+1(等价于: 1+1 = 2), 因此 2 索引 位置的数据是: 3; 所以: 5>3, 此次比较的最大值是: 5, 为true, 5 和 3 正在交换位置... 因此数组数据变成: 2 3 5 1, 进入j++... 索引: 0 1 2 3 ---------------------------------------------------------------------------------------- 第三次比较: j = 2, 因此 j < (4-i-1) 等价于 j < (4-0-1), 为true, 开始进入if判断... 判断: j = 2, 因此当前 2 索引位置的数据是: 5, 与后一位数据 j+1(等价于: 2+1 = 3), 因此 3 索引 位置的数据是: 1; 所以: 5>1, 此次比较的最大值是: 5, 为true, 5 和 1 正在交换位置... 因此数组数据变成: 2 3 1 5, 进入j++... 索引: 0 1 2 3 ---------------------------------------------------------------------------------------- 第四次比较: j = 3, 因此不符合 j < (4-i-1) 等价于 j < (4-0-1=3), 为false, 不进入if判断,正在进入 第二轮... ------------------------------------------------------------------------------------------- 第二轮: i = 1, 因此 i < (4-1=3), 为true,进入下一层代码... 第一次比较: j = 0, 因此 j < (4-i-1) 等价于 j < (4-0-1), 为true, 开始进入if判断... 判断: j = 0, 因此当前 0 索引位置的数据是: 2, 与后一位数据 j+1(等价于: 0+1 = 1), 因此 1 索引 位置的数据是: 3; 所以: 2<3, 此次比较为false, 位置不变, 正在进入下一次比较... 因此数组数据变成: 2 3 1 5, 进入j++... 索引: 0 1 2 3 ---------------------------------------------------------------------------------------- 第二次比较: j = 1, 因此 j < (4-i-1) 等价于 j < (4-0-1), 为true, 开始进入if判断... 判断: j = 1, 因此当前 1 索引位置的数据是: 3, 与后一位数据 j+1(等价于: 1+1 = 2), 因此 2 索引 位置的数据是: 1; 所以: 3>1, 此次比较的最大值是: 3, 为true, 3 和 1 正在交换位置... 因此数组数据变成: 2 1 3 5, 进入j++... 索引: 0 1 2 3 ---------------------------------------------------------------------------------------- 第三次比较: j = 2, 因此 j < (4-i-1) 等价于 j < (4-0-1), 为true, 开始进入if判断... 判断: j = 2, 因此当前 2 索引位置的数据是: 3, 与后一位数据 j+1(等价于: 2+1 = 3), 因此 3 索引 位置的数据是: 5; 所以: 3<5, 此次比较为false, 位置不变, 正在进入下一次比较... 因此数组数据变成: 2 1 3 5, 进入j++... 索引: 0 1 2 3 ---------------------------------------------------------------------------------------- 第四次比较: j = 3, 因此不符合 j < (4-i-1) 等价于 j < (4-0-1=3), 为false, 不进入if判断,正在进入 第三轮... ------------------------------------------------------------------------------------------- 第三轮: i = 2, 因此 i < (4-1=3), 为true,进入下一层代码... 第一次比较: j = 0, 因此 j < (4-i-1) 等价于 j < (4-0-1), 为true, 开始进入if判断... 判断: j = 0, 因此当前 0 索引位置的数据是: 2, 与后一位数据 j+1(等价于: 0+1 = 1), 因此 1 索引 位置的数据是: 1; 所以: 2>1, 此次比较的最大值是: 2, 为true, 2 和 1 正在交换位置... 因此数组数据变成: 1 2 3 5, 进入j++... 索引: 0 1 2 3 ---------------------------------------------------------------------------------------- 第二次比较: j = 1, 因此 j < (4-i-1) 等价于 j < (4-0-1), 为true, 开始进入if判断... 判断: j = 1, 因此当前 1 索引位置的数据是: 2, 与后一位数据 j+1(等价于: 1+1 = 2), 因此 2 索引 位置的数据是: 3; 所以: 2<3, 此次比较为false, 位置不变, 正在进入下一次比较... 因此数组数据变成: 1 2 3 5, 进入j++... 索引: 0 1 2 3 ---------------------------------------------------------------------------------------- 第三次比较: j = 2, 因此 j < (4-i-1) 等价于 j < (4-0-1), 为true, 开始进入if判断... 判断: j = 2, 因此当前 2 索引位置的数据是: 3, 与后一位数据 j+1(等价于: 2+1 = 3), 因此 3 索引 位置的数据是: 5; 所以: 3<5, 此次比较为false, 位置不变, 正在进入下一次比较... 因此数组数据变成: 1 2 3 5, 进入j++... 索引: 0 1 2 3 ---------------------------------------------------------------------------------------- 第四次比较: j = 3, 因此不符合 j < (4-i-1) 等价于 j < (4-0-1=3), 为false, 不进入if判断,正在进入 第四轮... -------------------------------------------------------------------------------------------- 第四轮: i = 3, 因此不符合 i < (4-1=3), 为false, 循环结束。 因此数组最终排序: 1 2 3 5; 索引: 0 1 2 3 */ } } 
    讯享网输出结果: 排序前:5 2 3 1 排序后:1 2 3 5 
数组排序总结

1、冒泡排序的思想

  • 从头开始,两两比较,把较大的元素与较小的元素进行交换
  • 每轮把当前最大的一个元素存入到数组当前的末尾

2、冒泡排序的实现步骤

  • 定义一个外部循环控制总共需要冒泡几轮:数组长度 - 1
  • 定义一个内部循环控制每轮依次往后比较几个位置:数组长度 - 轮数 - 1
  • 在内部循环内,定义一个if判断:当前位置的数据 > 后一个位置的数据,则两者交换,否则进入下一次比较
小讯
上一篇 2025-03-20 12:38
下一篇 2025-03-12 11:26

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/124424.html