java简单冒泡排序实例解析

发布时间 - 2026-01-11 02:44:42    点击率:

一、算法原理

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 

二、实现思路

用二重循环实现,外循环变量设为i,内循环变量设为j。假如有n个数需要进行排序,则外循环重复n-1次,内循环依次重复n-1,n-2,...,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,n-1,对于每一个i,j的值依次为0,1,2,...n-i 。

设数组长度为N:

1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。
2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
3.N=N-1,如果N不为0就重复前面二步,否则排序完成。

三、代码实现

package sort;
import java.util.Arrays;
/**
 * 冒泡排序
 * 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
 * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
 * 针对所有的元素重复以上的步骤,除了最后一个。
 * 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
 */

public class BubbleSort {
  public static void bubbleSort(int[] arr) {
    boolean flag=true;
    while (flag) {
      flag=false;
      int temp = 0;
      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]) {   //交换两数位置
            temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
            flag=true;
          }
        }
        if (!flag){
          break;
        }
        }
      }
    }
  public static void main(String[] args){
    int a[]=new int[]{345,22,43,12,65,335,124,636,3};
    BubbleSort.bubbleSort(a);
    System.out.print(Arrays.toString(a));
  }
}

 四、性能分析

若记录序列的初始状态为"正序",则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为"逆序",则需进行n(n-1)/2次比较和记录移动。因此冒泡排序总的时间复杂度为O(n*n)。

五、算法优化

冒泡排序法存在的不足及改进方法:

第一、在排序过程中,执行完最后的排序后,虽然数据已全部排序完备,但程序无法判断是否完成排序,为了解决这一不足,可设置一个标志位flag,将其初始值设置为true,表示被排序的表是一个无序的表,每一次排序开始前设置flag值为true,在进行数据交换时,修改flag为false。在新一轮排序开始时,检查此标志,若此标志为false,表示上一次没有做过交换数据,则结束排序;否则进行排序;

第二、在冒泡排序中,一趟扫描有可能无数据交换,也有可能有一次或多次数据交换,在传统的冒泡排序算法及近年来的一些改进的算法中,只记录一趟扫描有无数据交换的信息,对数据交换发生的位置信息则不予处理。为了充分利用这一信息,可以在一趟全局扫描中,对每一反序数据对进行局部冒泡排序处理,称之为局部冒泡排序。局部冒泡排序与冒泡排序算法具有相同的时间复杂度,并且在正序和逆序的情况下,所需的关键字的比较次数和移动次数完全相同。由于局部冒泡排序和冒泡排序的数据移动次数总是相同的,而局部冒泡排序所需关键字的比较次数常少于冒泡排序,这意味着局部冒泡排序很可能在平均比较次数上对冒泡排序有所改进,当比较次数较少的优点不足以抵消其程序复杂度所带来的额外开销,而当数据量较大时,局部冒泡排序的时间性能则明显优于冒泡排序。对于N个无序数据,我们在进行一趟冒泡排序时,如果第k个数据和第k+1个数据逆序,那么对第k+1个数据进行一趟向前的冒泡排序,使其移动到合适的位置,也就是说让前面k+1个数据调节为正序。因为这种冒泡法只对前k+1个数据冒泡处理,所以我们称它为——局部冒泡 

package sort;

import java.util.Arrays;

public class BubbleSort {
  public static void bubbleSort(int[] arr) {
    boolean flag=true;
    while (flag) {
      flag=false;
      int temp = 0;
      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]) {   //交换两数位置
            temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
            flag=true;
          }
        }
        if (!flag){
          break;
        }
        }
      }
    }
  public static void main(String[] args){
    int a[]=new int[]{345,22,43,12,65,335,124,636,3};
    BubbleSort.bubbleSort(a);
    System.out.print(Arrays.toString(a));
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java  # 冒泡排序  # Java算法之冒泡排序实例代码  # 详解Java冒泡排序  # Java冒泡排序简单实现  # java 算法之冒泡排序实例详解  # java List 排序之冒泡排序实例代码  # java数据结构与算法之冒泡排序详解  # java冒泡排序简单实例  # java实现的冒泡排序算法示例  # Java实现冒泡排序算法  # Java简单冒泡排序示例解析  # 数据交换  # 这一  # 第一个  # 在这  # 没有任何  # 只需  # 设为  # 所需  # 第二个  # 二个  # 依次为  # 越少  # 过程中  # 都是  # 是一个  # 对越  # 也有  # 有可能  # 遍历  # 将其 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何获取上海专业网站定制建站电话?  如何在腾讯云免费申请建站?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  如何在腾讯云服务器快速搭建个人网站?  Swift中switch语句区间和元组模式匹配  企业网站制作这些问题要关注  如何在景安云服务器上绑定域名并配置虚拟主机?  百度浏览器如何管理插件 百度浏览器插件管理方法  java获取注册ip实例  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  Laravel怎么在Controller之外的地方验证数据  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  如何自定义建站之星网站的导航菜单样式?  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  如何用IIS7快速搭建并优化网站站点?  在线制作视频网站免费,都有哪些好的动漫网站?  浅谈redis在项目中的应用  HTML 中如何正确使用模板变量为元素的 name 属性赋值  微信小程序 require机制详解及实例代码  java ZXing生成二维码及条码实例分享  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  如何快速生成ASP一键建站模板并优化安全性?  如何彻底卸载建站之星软件?  Swift中swift中的switch 语句  网站建设要注意的标准 促进网站用户好感度!  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  如何在阿里云高效完成企业建站全流程?  如何快速搭建支持数据库操作的智能建站平台?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  进行网站优化必须要坚持的四大原则  JS实现鼠标移上去显示图片或微信二维码  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  制作电商网页,电商供应链怎么做?  Laravel Fortify是什么,和Jetstream有什么关系  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  Laravel如何实现一对一模型关联?(Eloquent示例)  LinuxShell函数封装方法_脚本复用设计思路【教程】  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  如何用美橙互联一键搭建多站合一网站?  UC浏览器如何设置启动页 UC浏览器启动页设置方法  用yum安装MySQLdb模块的步骤方法  Laravel如何实现API版本控制_Laravel版本化API设计方案  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】