首页 > 编程语言 >进阶 Java冒泡排序递归法 有点难度哦

进阶 Java冒泡排序递归法 有点难度哦

时间:2024-08-14 17:27:23浏览次数:14  
标签:arr Java 进阶 递归 int maxIndex 冒泡排序 temp 数组

简介

这里有用到递归的冒泡排序思路,难度对新手很大,不明白递归和冒泡排序的小伙子可以先看看我的其他两个文章。

连接在这里:
  1. Java 冒泡排序icon-default.png?t=N7T8https://blog.csdn.net/ouhexie/article/details/140985984?spm=1001.2014.3001.5501
  2. Java 递归算法icon-default.png?t=N7T8https://blog.csdn.net/ouhexie/article/details/140984060?spm=1001.2014.3001.5501

案例

我们来详细解析这段代码的每一部分。

首先呢,是我们的main方法哈:

public static void main(String[] args) {
    int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
    randomOrder(arr);
    System.out.println("打乱后的数组顺序");
    System.out.println(Arrays.toString(arr));

    bubbleSort(arr, arr.length - 1);
    System.out.println("递归后的数组顺序:");
    System.out.println(Arrays.toString(arr));
}
  • 定义数组:初始化一个长度为20的整型数组,元素按顺序从1到20。

  • 打乱数组:调用 randomOrder 方法,将数组元素的顺序打乱。

  • 打印打乱后的数组:显示打乱后的数组内容。

  • 递归冒泡排序:调用 bubbleSort 方法,对打乱后的数组进行排序。

  • 打印排序后的数组:显示排序后的数组内容。

紧接着,是randomOrder(int [] arr)方法

private static void randomOrder(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        int randomIndex = (int) (Math.random() * arr.length);
        int temp = arr[i];
        arr[i] = arr[randomIndex];
        arr[randomIndex] = temp;
    }
}
获取数组长度内的随机索引
  • Math.random():生成一个范围在 [0.0, 1.0) 之间的随机浮点数。

  • Math.random() * arr.length:将这个随机数乘以数组的长度,得到一个范围在 [0.0, arr.length) 之间的浮点数。

  • (int):强制转换为整数,取整以获得数组中的有效索引值。

交换元素
  • int temp = arr[i]:将当前元素 arr[i] 存储在临时变量 temp 中。

  • arr[i] = arr[randomIndex]:将随机索引位置的元素赋值给当前索引 i

  • arr[randomIndex] = temp:将临时变量 temp 的值(原 arr[i] 的值)赋值给随机索引位置arr[randomIndex]。 

然后嘞,是bubbleSort(int [] arr, int maxIndex)方法

private static void bubbleSort(int[] arr, int maxIndex) {
    // 递归结束条件
    if (maxIndex < 1) {
        return;
    }
    // 每次递归只会执行一次循环
    for (int j = 0; j < maxIndex; j++) {
        if (arr[j] > arr[j + 1]) {
            int temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
    // 反复递归直到传入的下标小于0结束递归
    bubbleSort(arr, maxIndex - 1);
}

递归结束条件:当 maxIndex 小于1时,递归终止。这是因为数组已经排序好,或者只剩下一个元素时无需再排序。

  • 冒泡排序逻辑:

    • 外层循环:控制比较的轮次,每轮将一个最大元素移动到当前未排序部分的末端。

    • 内层循环:在当前范围内比较相邻元素,并在必要时交换它们的位置。

  • 递归调用:每轮排序后,调用 bubbleSort 方法递归处理剩余的部分(maxIndex - 1)。

源码哦:

import java.util.Arrays;

/**
 * @version 1.0
 * @ClassName BubbleSort
 * @Description 冒泡排序
 * @Author NanJi
 * @Date 2024/7/12 - 10:37
 */
public class BubbleSort {
    public static void main(String[] args) {
        // 定义一个长度为 20 的整形数组
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
        // 打乱数组的元素
        randomOrder(arr);
        System.out.println("打乱后的数组顺序");
        System.out.println(Arrays.toString(arr));

        // 递归冒泡排序
        bubbleSort(arr, arr.length - 1);
        System.out.println("递归后的数组顺序:");
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 冒泡排序
     *
     * @param arr 要排序的数组
     */
    private static void bubbleSort(int[] arr) {
        // 循环遍历数组元素,比较相邻的元素,交换位置
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                // 如果前一个元素大于后一个元素,则交换位置
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

    /**
     * 递归冒泡排序
     *
     * @param arr      传入的数组
     * @param maxIndex 数组的最大下标
     */
    private static void bubbleSort(int[] arr, int maxIndex) {
        // 递归的结束条件
        if (maxIndex < 1) {
            return;
        }
        // 循环遍历数组元素,比较相邻的元素,交换位置
        for (int j = 0; j < maxIndex; j++) {
            // 如果前一个元素大于后一个元素,则交换位置
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
        // 递归调用自身
        bubbleSort(arr, maxIndex - 1);
    }

    /**
     * 打乱数组元素的顺序
     *
     * @param arr 要打乱的数组
     */
    private static void randomOrder(int[] arr) {
        // 循环打乱数组元素
        for (int i = 0; i < arr.length; i++) {
            // 获取数组的索引值
            int randomIndex = (int) (Math.random() * arr.length);
            int temp = arr[i];
            arr[i] = arr[randomIndex];
            arr[randomIndex] = temp;
        }
    }
}

欧了,到这里我应该解释的差不多啦,我是南极,大胆做自己,活出精彩的人生

标签:arr,Java,进阶,递归,int,maxIndex,冒泡排序,temp,数组
From: https://blog.csdn.net/ouhexie/article/details/141194409

相关文章

  • 基于Java的校园外卖系统设计与实现。开题报告+答辩PPT+万字论文
    准备毕业设计的时候到了,相信大部分宝子们还没有头绪吧。看完本文会让你受益匪浅。一、项目介绍 本系统是面向所有人的外卖点餐系统。系统内的角色分为管理员和前台用户。管理员有权登录管理端进行如员工信息管理、分类、菜品与套餐管理、查看订单详情及编辑个人资料等操作......
  • java+testng+selenium实现测试用例过程的录制,生成GIF。
    1.功能需求:支持灵活配置:因为本身已有用例执行失败的截图功能,所以需要支持针对单条测试用例的配置;支持testng框架xml多线程的执行;录制内容文件小、支持调整录制每帧间隔、每条用例录制最大时长(避免用例元素未定位到时长时间录制)。2.灵活配置实现创建注解,通过在测试用......
  • C#进阶-ASP.NET实现可以缩放和旋转的图片预览页
    本文详细介绍了如何在ASP.NETWebForms中实现一个功能丰富的图片预览页面。通过结合HTML、CSS和JavaScript,用户可以方便地对图片进行放大、缩小以及旋转操作。文章从页面的基本布局开始,逐步讲解了如何设置图片展示区、添加控制按钮、编写CSS样式以及实现JavaScript功能,最终展示了......
  • JavaSE基础知识分享(六)
    写在前面前面讲的是面向对象中的多态这部分,下面让我们来看看java中常用类这部分的内容!常用类Object概述:是Java中所有类的父类,包括自己定义的类和数组都继承自Object类。成员方法hashCode()获取对象地址值的int类型形式。getClass()获取对象的类的字节码文件对......
  • java流程控制之选择结构
    if单选择结构:我们很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程在程序中用if语句来表达。语法为:if(布尔表达式){//为true执行语句}if双选择结构:两个判断,if-else。语法为:if(布尔表达式){//为true执行语句}else{//为......
  • java后端详解中
    1.日期时间yyyy表示当天所在的年YYYY代表是weekinwhichyear,表示当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的YYYY就是下一年。表示日期和时间的格式:newSimpleDateFormat("yyyy-MM-dd:HH:mm:ss")1)表示月份是大写的M;2)表示分钟则是小写的m;3)24小......
  • JAVA毕业设计|ssm高校宿舍管理系统的设计与开发jsp包含文档代码讲解
    收藏点赞不迷路 关注作者有好处文末获取源码一、系统展示二、万字文档展示 基于ssm高校宿舍管理系统的设计与开发jsp开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis+Vue工具:IDEA/Ecilpse、Navicat、Maven 编号:ssm283一、系统展示二、万字文档展示第......
  • JAVA毕业设计|(免费)ssm实验室管理与排课系统包含文档代码讲解
     收藏点赞不迷路 关注作者有好处编号:ssm458ssm实验室管理与排课系统开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis+Vue工具:IDEA/Ecilpse、Navicat、Maven文末获取源码(免费领源码)1.系统展示2.万字文档展示第5章系统详细设计最后对选题、开题、毕设开......
  • JAVA毕业设计|(免费)基于ssm的星巴克咖啡店管理系统包含文档代码讲解
     收藏点赞不迷路 关注作者有好处编号:ssm449基于ssm的星巴克咖啡店管理系统开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis+Vue工具:IDEA/Ecilpse、Navicat、Maven文末获取源码(免费领源码)1.系统展示2.万字文档展示第5章系统详细设计5.1管理员角色功能设计......
  • JAVA毕业设计|(免费)基于SSM的蛋糕甜品店管理系统的设计与开发jsp包含文档代码讲解
    收藏点赞不迷路 关注作者有好处编号:ssm544基于SSM的蛋糕甜品店管理系统的设计与开发jsp开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis+Vue工具:IDEA/Ecilpse、Navicat、Maven文末获取源码(免费|领源码)1.系统展示2.万字文档展示第5章系统详细设计5.1个人中......