排序算法--冒泡排序

2023-11-15

基本思想

基本思想: 冒泡排序,类似于水中冒泡,较大的数沉下去,较小的数慢慢冒起来,假设从小到大,即为较大的数慢慢往后排,较小的数慢慢往前排。
直观表达,每一趟遍历,将一个最大的数移到序列末尾

实例演示

在这里插入图片描述
在这里插入图片描述
排序的过程:两两比较,以第一趟排序的过程距离:
10跟1比较, 10>1, —》1 10
10跟35比较,10<35, —》1 10 35
35跟61比较,35<61, —》1 10 35 61
61跟89比较,61<89, —》1 10 35 61 89
89跟36比较,89>36, —》1 10 35 61 36 89
89跟55比较,89>55, —》1 10 35 61 36 55 89
到此第一趟排序结束,确定了最大数为89,放在了最后一个位置,后面的每一趟排序都是找到最大的数,将其放在序列末尾,直至第n-1次排序,确定了倒数第二个数和最后一个数的大小关系。

代码实现

基础实现

第一趟排序的实现:第一趟排序就是找出该序列中最大的一个数

package com.company.sort;

import java.util.Arrays;

public class Bubble {
    public static void main(String[] args) {
        //冒泡排序算法
        //待排序数组
        int[] list={10,1,35,61,89,36,55};
        //临时变量,用作交换
        int temp=0;
        for(int j=0;j<list.length-1;j++){
            if(list[j]>list[j+1]){
                temp=list[j+1];
                list[j+1]=list[j];
                list[j]=temp;
            }
        }
        System.out.println(Arrays.toString(list));
    }
}

结果:
在这里插入图片描述
第二趟排序:第二趟排序就是找出第二大的数。将第一趟找出的最大数不参与比较,用相同的方式比较剩下的数,找出最大的,注意这里的区别在list.length-1-1

package com.company.sort;

import java.util.Arrays;

public class Bubble {
    public static void main(String[] args) {
        //冒泡排序算法
        //待排序数组
        int[] list={10,1,35,61,89,36,55};
        //临时变量,用作交换
        int temp=0;
        //第一趟排序
        for(int j=0;j<list.length-1;j++){
            if(list[j]>list[j+1]){
                temp=list[j+1];
                list[j+1]=list[j];
                list[j]=temp;
            }
        }
        System.out.println(Arrays.toString(list));

        //第二趟排序
        for(int j=0;j<list.length-1-1;j++){
            if(list[j]>list[j+1]){
                temp=list[j+1];
                list[j+1]=list[j];
                list[j]=temp;
            }
        }
        System.out.println(Arrays.toString(list));
    }
}

结果:
在这里插入图片描述
因为选择的序列里面有七个数,所以最基础的冒泡排序需要进行六趟比较:

package com.company.sort;

        import java.util.Arrays;

public class Bubble {
    public static void main(String[] args) {
        //冒泡排序算法
        //待排序数组
        int[] list={10,1,35,61,89,36,55};
        //临时变量,用作交换
        int temp=0;
        //第一趟排序
        for(int j=0;j<list.length-1;j++){
            if(list[j]>list[j+1]){
                temp=list[j+1];
                list[j+1]=list[j];
                list[j]=temp;
            }
        }
        System.out.println(Arrays.toString(list));

        //第二趟排序
        for(int j=0;j<list.length-1-1;j++){
            if(list[j]>list[j+1]){
                temp=list[j+1];
                list[j+1]=list[j];
                list[j]=temp;
            }
        }
        System.out.println(Arrays.toString(list));

        //第三趟排序
        for(int j=0;j<list.length-1-2;j++){
            if(list[j]>list[j+1]){
                temp=list[j+1];
                list[j+1]=list[j];
                list[j]=temp;
            }
        }
        System.out.println(Arrays.toString(list));
        //第四趟
        for(int j=0;j<list.length-1-3;j++){
            if(list[j]>list[j+1]){
                temp=list[j+1];
                list[j+1]=list[j];
                list[j]=temp;
            }
        }
        System.out.println(Arrays.toString(list));
		//第五趟
        for(int j=0;j<list.length-1-4;j++){
            if(list[j]>list[j+1]){
                temp=list[j+1];
                list[j+1]=list[j];
                list[j]=temp;
            }
        }
        System.out.println(Arrays.toString(list));
        //第六趟
        for(int j=0;j<list.length-1-5;j++){
            if(list[j]>list[j+1]){
                temp=list[j+1];
                list[j+1]=list[j];
                list[j]=temp;
            }
        }
        System.out.println(Arrays.toString(list));
    }
}

结果:
在这里插入图片描述
从代码可以看出,这几次比较代码几乎就是相同的,除了j<list.length这个部分
可以将这六个单层循环用一个两个循环实现:

for(int i=0;i<list.length-1;i++){
    for(int j=0;j<list.length-1-i;j++){
        if(list[j]>list[j+1]){
            temp=list[j+1];
            list[j+1]=list[j];
            list[j]=temp;
          }
     }
     System.out.println(Arrays.toString(list));
 }

结果:
在这里插入图片描述

代码优化

从上面排序的结果可以看出,使用的冒泡排序在第二轮得到的结果就是最终的排序结果,所以我们可以对算法进行优化,优化的思路如下
当某一轮中没有出现交换元素次序的时候,得到的就是最终的排序结果

package com.company.sort;

        import java.util.Arrays;

public class Bubble {
    public static void main(String[] args) {
        //冒泡排序算法
        //待排序数组
        int[] list={10,1,35,61,89,36,55};
        //临时变量,用作交换
        int temp=0;
        //标志位,用于标记是否发生了交换元素
        boolean flag=false;

        for(int i=0;i<list.length-1;i++){
            for(int j=0;j<list.length-1-i;j++){
                if(list[j]>list[j+1]){
                    flag=true;
                    temp=list[j+1];
                    list[j+1]=list[j];
                    list[j]=temp;
                }
            }

            System.out.println(Arrays.toString(list));
            if(!flag){
                break;
            }else{
                flag=false;
            }
        }

    }
}



在这里插入图片描述

如果某一次排序没有产生元素交换,那该次排序的结果就是最终结果。

注意这里没有使用没有元素交换的排序的上一次结果作为最终结果,因为若该序列本身为有序时,将不会有任何输出。代码如下:

package com.company.sort;

        import java.util.Arrays;

public class Bubble {
    public static void main(String[] args) {
        //冒泡排序算法
        //待排序数组
        int[] list={1,2,3,4,5};
        //临时变量,用作交换
        int temp=0;
        //标志位,用于标记是否发生了交换元素
        boolean flag=false;

        for(int i=0;i<list.length-1;i++){
            for(int j=0;j<list.length-1-i;j++){
                if(list[j]>list[j+1]){
                    flag=true;
                    temp=list[j+1];
                    list[j+1]=list[j];
                    list[j]=temp;
                }
            }
            if(!flag){
                break;
            }else{
                flag=false;
            }
            System.out.println(Arrays.toString(list));

        }

    }
}

结果:
在这里插入图片描述
结果没有输出,因为已经退出循环,没有进行打印。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序算法--冒泡排序 的相关文章

  • XSD 验证错误:在 web.xml 中找不到 TagLib 标记

    我详细显示错误如下 cvc complex type 2 4 a 发现以元素开头的无效内容 taglib One of http java sun com xml ns javaee 描述 http java sun com xml ns
  • 从 J2SE 5.0 学习 Java SE 6 有多难?

    我是新来的 我有一个简单的问题 希望有人能帮助我 我即将开始学习Java 正在寻找一本好的教材来使用 我发现 Y Daniel Liang 的 Java 编程入门 评价很高 但我想知道是否可以使用旧的第 6 版 2006 年 7 月 22
  • Jackson反序列化SNS消息错误MismatchedInputException

    我正在编写一个通过 SNS HTTP 请求处理来自 Amazon Simple Email Service 的回调的功能 我想将亚马逊提供的消息解析为本地对象结构 问题是 SNS 将 JSON 消息包装成字符串 并且 Jackson 无法解
  • Maven:无法在 OS X 上找到 java.lang 问题

    当我尝试时遇到以下问题mvn clean install显然它无法找到运行时 jar 但我需要做什么 错误日志 ERROR COMPILATION ERROR INFO ERROR Failure executing javac but c
  • 确定列表编号是否连续

    我在 Java 工作 我有一个无序列表 包含 5 个数字 范围从 0 100 没有重复 我想检测其中 3 个数字是否连续且没有间隙 例子 9 12 13 11 10 true 17 1 2 3 5 true 19 22 23 27 55 f
  • Java生成范围内不重复的随机数

    我想生成 1 到 4 范围内的随机数 包括 4 这是我的代码 int num r nextInt 4 1 r is instance of Random 但是 我在循环中运行上述代码 并且不想重复随机数 现在发生的事情我经常得到 1 1 1
  • 堆内存与对象内存

    根据一篇关于Java内存和特性的论文 内存分数分为两种类型 堆内存 即应用程序在运行时消耗的内存 对象内存 即程序中使用的各种对象分配的内存 例如整数和字符串等 他们的意思是stack当他们说时的记忆object记忆 或者它们是什么意思 很
  • 膨胀类 android.support.v7.internal.widget.NativeActionModeAwareLayout 时出错

    如果您以前解决过这个问题 请有人帮助我 我正在尝试使用材料设计制作一些东西 以便应用程序可以运行到 API 10 的低版本 我的代码中没有任何错误 但我不断收到此错误 Android 日志猫 06 01 05 05 37 414 E And
  • 在所有方法调用上允许类型见证有什么意义?

    假设我们有两种方法 如下所示 public static
  • 使用枚举变量切换字符串

    我有一个具有不同值的枚举 并且想要切换字符串变量 现在 我在尝试将枚举值转换为字符串 可以用作大小写常量 时遇到了困难 我最好的尝试是将枚举转换为字符串数组 但开关似乎不接受数组值作为大小写常量 IntelliJ 说 需要恒定的表达 Enu
  • 无法在android中使用retrofit发出@Post请求

    我正在学习如何在 android 中使用改造 但是每当我尝试从互联网检索数据时 我的应用程序不会返回任何内容我的响应没有成功 我不知道如何修复当前我正在尝试发布的错误并使用此 URL 检索数据https jsonplaceholder ty
  • 公共领域有哪些替代方案?

    我正在用 java 编写一个游戏 正如问题标题建议的那样 我在类中使用公共字段 暂且 据我所知 公共领域很糟糕 我有一些理解其中的原因 但如果有人能澄清为什么你不应该使用它们 那将不胜感激 问题是 从我所看到的来看 这似乎是合乎逻辑的 是使
  • 使用 java 中的准备好的语句插入自定义 SQL 类型

    我有一些自定义类型 它们基本上都是枚举 以下是它们的外观示例 CREATE TYPE card suit AS ENUM spades clubs hearts diamonds 我在 Java 中有一些准备好的语句 看起来像这样 Setu
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例
  • JS 中的 .Jar 文件

    有谁知道如何在 JS 中访问 jar 文件 我已经用 Java 创建了类并作为 jar 文件导入 我想从 JS 文件访问该类 大家好 我感谢你们所有人 我尝试在 Firefox XUL 中使用 JS 列出文件夹中的文件 但我做不到 然后我决
  • 未找到 GroovyEvaluator

    我会尝试在以下位置制作我的 PIE 3D 报告iReport 在我的 struts xml 中 我用这个来调用我的报告
  • 如何组织课程、课程包[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 您如何决定包名称应该是什么以及什么类应该放入哪个包中 我正在开发一个项目 在该项目中 我不断添加 删除类 并且不确定我是否需要一个新包 或者应该将其添
  • 无法验证 serde:org.openx.data.jsonserde.jsonserde

    我编写了这个查询来在配置单元上创建一个表 我的数据最初是 json 格式 所以我已经下载并构建了 serde 并添加了它运行所需的所有 jar 但我收到以下错误 FAILED Execution Error return code 1 fr
  • Swing:如何创建事件并将其分派给组件?

    我需要将一些事件发送到 Swing 中的组件 因此它的处理方式就像任何用户生成的标准 Swing 事件一样 基本上 类似于宏记录器 然后是 JEditorPane 的执行器 但我需要对生成的事件有更多的控制 所以 假设我有一个编辑 我想 捕
  • java 更新进度条

    我有一个 JFrame 和以下组件 JButton jButton1 Progress Bar ProgressBar 及其公共静态 JLabel 状态及其公共静态 单击按钮时会执行不同的语句 我想在每个语句后更新我的进度条 这是我的代码

随机推荐

  • python selenium爬虫自动登录实例

    一 概述 我们要先安装selenium这个库 使用pip install selenium 命令安装 selenium这个库相当于机器模仿人的行为去点击浏览器上的元素 这时我们要用到一个浏览器的驱动 这里我用的是谷歌浏览器 二 安装驱动 确
  • Golang RabbitMQ实现的延时队列

    文章目录 前言 一 延时队列与应用场景 二 RabbitMQ如何实现延时队列 实现延时队列的基本要素 整体的实现原理如下 三 Go语言实战 生产者 消费者 前言 之前做秒杀商城项目的时候使用到了延时队列来解决订单超时问题 本博客就总结一下G
  • C/C++ 内存管理(malloc/calloc/realloc、free 和 new 、 delete区别;内存泄漏)

    C C 内存分布 int globalVar 1 static int staticGlobalVar 1 globalVar和staticGlobalVar是在main函数之前初始化 在哪都能用 作用域是全局的 区别 它俩的链接属性不一样
  • 全景分割(Panoptic Segmentation)(CVPR 2019)

    全景分割 Panoptic Segmentation CVPR 2019 摘要 1 导言 2 相关工作 3 全景分割格式 4 全景分割度量 4 1 片段匹配 4 2 PQ计算 4 3 与现有度量的比较 5 全景分割数据集 6 人类一致性研究
  • PAL 和NTSC说明?

    PAL 720 576 25HZ NTSC 720 480 30HZ 576i是一种视频格式的缩写 字母 i 表示 隔行扫描 数字576表示水平方向有576条 扫描线 通常通常垂直分辨率为720或者704像素 换句话说 标准画质电视 SDT
  • STM32学习笔记:CAN总线的过滤器

    STM32 CAN控制器 提供了28个可配置的筛选器组 F1仅互联型才有28个 其他的只有14个 STM32 CAN控制器每个筛选器组由2个32位寄存器组成 CAN FxR1和CAN FxR2 x 0 27 根据位宽不同 每个筛选器组可提供
  • 使用cBioPortal查看TCGA肿瘤数据

    欢迎关注 生信修炼手册 cBioPortal整合了来自TCGA CCLE以及几个独立的大型肿瘤研究项目的数据 构建了一个易于使用的网站 不需要有深厚的计算机功底 也可以通过该网站查询 分析 可视化肿瘤的相关结果 针对该网站的使用 官方专门发
  • leetcode 322. Coin Change硬币交换问题

    题目详细 描述 You are given coins of different denominations and a total amount of money amount Write a function to compute th
  • 美国国家安全局(NSA)网络攻击主战武器NOPEN

    国家计算机病毒应急处理中心14日正式发布了美国国家安全局专用 NOPEN 远控木马分析报告 揭露了美国情治部门的网络间谍手段 国家计算机病毒应急处理中心 信息安全摘要 近日 国家计算机病毒应急处理中心对名为 NOPEN 的木马工具进行了攻击
  • 排序算法--冒泡排序

    冒泡排序 基本思想 实例演示 代码实现 基础实现 代码优化 基本思想 基本思想 冒泡排序 类似于水中冒泡 较大的数沉下去 较小的数慢慢冒起来 假设从小到大 即为较大的数慢慢往后排 较小的数慢慢往前排 直观表达 每一趟遍历 将一个最大的数移到
  • 雅可比(jacobi)迭代法 matlab实现

    clc clear n input 请输入矩阵阶数 n for i 1 n fprintf 请输入矩阵第 d行 n i A i input end A B 1 input 请输入B向量 n B for i 1 n x i 0 x2 i 0
  • 动态规划之完全背包问题

    完全背包问题 题目 有 N N N 种物品和一个容量为 V V V 的背包 每种物品都有无限件可用 放入第 i
  • javascript 的MD5代码备份,跟java互通

    var MD5 function string function RotateLeft lValue iShiftBits return lValue lt
  • mybatis 批量增加 Parameter '__frch_item_0' not found. Available parameters are [list]

    当在mybatis用到foreach的时候 会报这个错误Parameter frch item 0 not found Available parameters are list 会出现的几种解决方案 例子 sql view plain c
  • 【Linux操作系统】【综合实验二 vi应用与shell脚本编辑】【浅试编辑命令】

    文章目录 一 实验目的 二 实验要求 三 实验内容 1 继续练习Linux系统的文件类 目录类 进程管理类与磁盘操作类常用命令 并使用常见的选择项 2 了解ed ex行编辑器与Emacs全屏幕编辑器的工作模式 基本操作命令 3 掌握vi的编
  • 静态测试

    之前对 静态测试 一直不怎么理解 一直徘徊在为什么要进行静态测试 看了下面这几篇文章 突然觉得的柳暗花明了 目前我正在测试的项目xx让我烦心的问题终于找到出路了 http qa taobao com p 8017 http qa taoba
  • 资产收集的方法总结

    资产收集的方法总结 文章目录 资产收集的方法总结 前言 一 资产收集基本名词概念 二 相关收集方法 1 fofa 2 google搜索语法 3 logo 4 favicon ico 5 关键字 6 维基百科 7 天眼查 企查查 8 微信公众
  • 设计模式之UML类图该怎么画

    关于可维护 可复用 可扩展 灵活性好的理解 生活中 印刷术和活字印刷 当需要对某些内容修改时 印刷术只要有一丁点变化 就需要重头再来 而活字印刷只需要进行部分修改即可 可维护 只更改要更改的内容 可复用 之前的内容并非用完就无用 后面仍可使
  • Caused by: java.lang.NoClassDefFoundError: javax/tools/ToolProvider

    解决方案 在pom文件中的scala maven plugin插件下面加入一个参数 pom xml配置如下
  • python + selenium实现自动登录操作(以淘宝为例)

    selenium操作不熟练的可以查看一下这篇文章 selenium操作大全 一 登录前准备操作 定位一下相对应html位置 输入一般为input标签 登录按钮一般为button 输入账号密码那块 定位代码 driver find eleme