冒泡排序--java(详解)

2023-11-13

对于一个数组[4, 6, 3, 9]而言:

首先进行第一轮:

第一次比较:4<6 所以不用交换两元素 数组不变为[4, 6, 3, 9]

第二次比较:6>3 所以交换两元素 得到一个新数组为[4, 3, 6, 9]

第三次比较:6<9 所以不用交换两元素 数组不变为[4, 3, 6, 9]

第一轮完成 确定一个数归位 即9

然后进行第二轮:

第一次比较:4>3 所以交换两元素 得到一个新数组为[3, 4, 6, 9]

第二次比较:4<6 所以不用交换两元素 数组不变为[3, 4, 6, 9]

第二轮完成 确定一个数归位 即6

然后进行第三轮:

第一次比较:3<4 所以不用交换两元素 数组不变为[3, 4, 6, 9]

第三轮完成 确定一个数归位 即4

最后将原数组升序排序 得到新数组[3, 4, 6, 9]

结论:前提条件总轮数是从1开始计数的:

总轮数 = 元素总个数 - 1

当前轮数(i)对应的总比较次数 = 元素总个数 - i

但是循环中一般都是从0开始计数的 所以规律应该是以下这样子的:

总轮数 = 元素总个数 - 1

当前轮数(i)对应的总比较次数 = 元素总个数 - i - 1

下面是冒泡排序的图解过程:

冒泡排序图解.xmind

接着是冒泡排序的代码实现:

// 这一个版本是冒泡排序的初始版本
public class BubbleSort{
    // 定义一个主函数 用于调用冒泡排序函数
    public static void main(String[] args){
        // 定义一个int类型数组
        int[] arr = {4, 6, 3, 9};
        // 打印排序前的数组
        System.out.println(Arrays.toString(arr));
        // 调用冒泡排序函数对数组进行排序
        bubbleSort(arr);
        // 打印排序后的数组
        System.out.println(Arrays.toString(arr));
    }
    // 定义一个函数 用于对无序数组进行冒泡排序 使其升序排序 接收一个参数 即目标数组
    public 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;
                }
            }
        }
    }
}

但是其实这个排序方法存在两个优化的地方:

1.如果数组还未进行到最后一步就已经完成排序的话 那么其实不需要再继续进行下去了

2.如果冒泡排序某个阶段的数组是由前一部分的无序部分和后一部分的有序部分组成的 那么排序范围应该是针对前一部分的这个无序部分 而不是整个部分

3.其实上述的代码没有指定特殊情况的处理机制

针对上述这三个需要优化的地方,我们重新优化后的代码如下所示

// 这一个版本是冒泡排序的优化版本
public class BubbleSortOptimization{
    // 定义一个主函数 用于调用冒泡排序函数
    public static void main(String[] args){
        // 定义一个int类型数组
        int[] arr = {4, 6, 3, 9};
        // 打印排序前的数组
        System.out.println(Arrays.toString(arr));
        // 调用冒泡排序函数对数组进行排序
        bubbleSort(arr);
        // 打印排序后的数组
        System.out.println(Arrays.toString(arr));
    }
    // 定义一个函数 用于对无序数组进行冒泡排序 使其升序排序 接收一个参数 即目标数组
    public static void bubbleSort(int[] arr){   
        // 定义一个变量 用于记录无序部分和有序部分的边界 初始值为arr.length-0-1 即arr.length-1
        int sortBorder = arr.length - 1;
        // 定义一个变量 用于记录最后进行交换的元素中的相对靠前元素的下标 初始值为0
        int lastExchangeIndex = 0;
        // 针对特殊情况 以下是处理机制
        if(arr == null || arr.length < 2){
            return;
        }
        // 定义两层循环 外层循环表示的是轮数 内层循环表示的是比较次数
        for(int i = 0; i < arr.length - 1; i++){
            // 定义一个变量 用于判断当前内层循环中是否存在两数交换的情况 初始值为true
            boolean isSort = true;
            for(int j = 0; j < sortBorder; j++){
                // 当相对靠前的数大于相对靠后的数时 交换两个数
                if(arr[j] > arr[j + 1]){
                    // 将isSort赋值为false
                    isSort = false;
                    // 下列过程为两数交换的过程
                    // 定义一个临时变量 用于储存相对靠前的数
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    // 记录以下最后进行交换的元素下标
                    lastExchangeIndex = j;
                }
            }
            // 当一个内层循环结束后 应该对这个内层循环进行判断 如果这个内层循环不存在两数交换的情况 那么就终止循环
            if(isSort){
                break;
            }
            // 当一个内层循环结束后 应该对边界变量重新赋值
            sortBorder = lastExchangeIndex;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

冒泡排序--java(详解) 的相关文章

随机推荐

  • c语言a b等于c的编程,简单的a+b (C语言代码)

    解题思路 题目中要求多次输入 所以需要一个死循环来进行控制 一般采用while 1 或者for 注意事项 scanf 函数需要加上取地址符 且它的返回值 它的返回值可以分成三种情况 1 正整数 表示正确输入参数的个数 例如执行 scanf
  • Java学习笔记——String类

    目录 API概述 案例 键盘录入字符串 String 概述 String类的常见构造方法 创建字符串对象的区别 String常见的面试题 字符串的比较 案例 用户登录 遍历字符串 案例 手机号屏蔽 字符串截取方法 案例 敏感词替换 字符串替
  • 决策树概述+模块介绍+重要参数(criterion+random_state&splitter+减枝参数+目标权重参数)+回归树(参数+实例+拟合正弦曲线)+泰坦尼克号生存者预测实例

    文章目录 什么是sklearn 一 决策树概述 一 概述 二 基础概念 三 决策树算法的核心是要解决两个问题 二 模块sklearn tree的使用 一 模块介绍 二 使用介绍 三 重要参数 一 criterion 二 random sta
  • JavaScript_day02

    文章目录 BOM与DOM操作 BOM操作 window子对象 history对象 location对象 掌握 弹出框 计时器相关 DOM操作 查找标签 节点操作 innerText 和 innerHTML 获取值操作 class css操作
  • 电机控制基础——定时器捕获单输入脉冲原理

    1 问题引出 在单片机与嵌入式开发中 某些场景需要捕获传感器的高电平 或低电平 信号的持续时间 如红外解码信号 编码器输入信号等 如下图 以单一的一段高电平输入信号为例 如何测量这段高电平的时间呢 从直观上理解 就是要不断的检测这个信号 当
  • IPv6与Volp

    文章目录 前言 1 IP v4与IP v6 1 1 IP v4的概念与存在的问题 1 2 ipv6概述 1 3 对比IP v4 IP v6的优点 1 3 ipv4与ipv6的包头比较 1 4 IP v6的基本术语 1 5 IP v6地址表示
  • 自主异常检测算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码 数据 4 参考文献 1 概述 文献来源 本文介绍了一种在实证数据分析
  • Java并发编程之CyclicBarrier详解

    简介 栅栏类似于闭锁 它能阻塞一组线程直到某个事件的发生 栅栏与闭锁的关键区别在于 所有的线程必须同时到达栅栏位置 才能继续执行 闭锁用于等待事件 而栅栏用于等待其他线程 CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集
  • docker容器将系统盘空间占满的解决办法

    最近遇到一个问题 线上服务器的系统盘空间被占满了 导致服务不能正常运行了 docker启动时会报出下面这个错误 no space left on device 排查用到的命令 显示当前路径下占用空间超过1G的文件或文件夹 du h max
  • AD 原理图统一隐藏元器件的参数和序号

    AD 原理图统一隐藏元器件的参数和序号 如果隐藏元件参数 元件 右击 查找相似对象 确定 点击原理图 ctrl a 点击 属性对话框中 Part Conmment Hide 统一隐藏元件参数 如果隐藏元件序号 元件 右击 查找相似对象 确定
  • 用JAVA中的URL获取网页相关信息

    ava中有一个URL类 可以获取指定url的内容 import java io BufferedReader import java io InputStreamReader import java net URL public class
  • [Unity2D]在2D游戏里面实现人物的移动[消除抖动]

    Unity2D 在2D游戏里面实现人物的移动 先来一张效果图 一般的Unity2D游戏中 用WASD控制来移动人物角色的移动 缺陷 与含有碰撞器的强行碰撞时会发生抖动 原因 例如我人物要向左边走 利用脚本获取键盘输入 给人物角色一个向左边的
  • 一张图把DCDC电源拓扑“融会贯通”

    1 基本拓扑的由来 我们把一个电源电路抽象成一个黑盒电路模型 一个电源输入 一个电源输出 一个接地端口 对于非隔离电源 输入输出电路是共 地 的 所以非隔离电源的这个模型可以简化为图4 1 所示的模型 在所有的拓扑中 电感的一端需要连接到三
  • 使用docker部署golang编译环境

    前言 不想在windows上安装环境 打算docker部署 一拉一运行很方便 要注意的就是 官方的镜像跑起来后要改些参数再导成镜像 否则重启后改动消失 所以多一步 1 拉取镜像 运行镜像 docker pull golang docker
  • SpringBoot使用Swagger报NullPointerException

    第一次使用Swagger时报NullPointerException 在pom文件中引入Swagger 在启动项中加入注解 接口注解 运行出现NullPointerException 解决运行空指针问题 在pom文件中引入Swagger
  • Ini文件读取类,采用C++ STL实现

    背景 编程过程中经常会遇到读取Ini文件的场合 封装一个方便的类 能否避免重复编写 以后可复用 ini文件的格式很简单 并且不像xml之类的配置文件严谨 通常用于配置简单的键值对 本类测试文件如下
  • vuex的使用场景

    vuex的使用场景 首先 我们先来探讨一下 什么情况下vuex才是必须要到的呢 需要数据共享和行为进行拆分 复杂的异步逻辑 需要综合多个模块进行状态演进 需要用到第三方插件 需要综合考虑多个组件的生命周期 先后顺序 特定逻辑等等 vuex使
  • 如何在前端传递一个String 的变量和一个obj对象到后端,然后被Java后端接收

    首先我们通过post向后端发送请求 本篇博客仅纪录一下 在实际开发中需要从前端传递多值到后端 并且不存放到一个对象中进行传值处理 简单的一个案例展示该怎么做罢了 创建一个包含字符串和对象的数据 const postData stringVa
  • centos yum安装mysql出现的错误与解决办法

    1 InnoDB Error ib logfile0 of different size 错误的解决方法 查看Mysqld var log mysqld log 日志 发现以下错误 InnoDB Error log file usr loc
  • 冒泡排序--java(详解)

    对于一个数组 4 6 3 9 而言 首先进行第一轮 第一次比较 4 lt 6 所以不用交换两元素 数组不变为 4 6 3 9 第二次比较 6 gt 3 所以交换两元素 得到一个新数组为 4 3 6 9 第三次比较 6 lt 9 所以不用交换