Java冒泡排序及优化介绍
作者:HairLossException 发布时间:2023-11-11 13:05:51
什么是冒泡排序
冒泡排序指重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从小到大)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
思路分析
以{5,3,9,7,1}为例 要求排序后的数组元素顺序按从小到大排序。依次比较相邻的两个数(蓝色),将比较小的数放在前面,比较大的数放在后面。每一轮排序都能得到参与比较的数的最大值(红色)
第一轮排序
5,3,9,7,1 //如果数大于相邻的数就交换位置
3,5,9,7,1
3,5,9,7,1
3,5,7,9,1
3,5,7,1,9 //第一轮排序的结果
第二轮排序
3,5,7,1,9
3,5,7,1,9
3,5,7,1,9
3,5,1,7,9 //第二轮排序的结果
第三轮排序
3,5,1,7,9
3,5,1,7,9
3,1,5,7,9 //第三轮排序的结果
第四轮排序
3,1,5,7,9
1,3,5,7,9 //第四轮排序的结果
代码实现
public class bubble {
public static void main(String[] args) {
int[] array = {5,3,9,7,1};
bubbleSort(array);
}
/**
* 冒泡排序
*/
public static void bubbleSort(int[] array){
int temp;
//一共进行length-1次排序
for (int i = 0; i < array.length-1; i++) {
//数组中没有元素或者只有一个元素就无需排序
if(array==null || array.length < 2 ){
return;
}
//每进行一次排序后参与比较的数量减一
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j]>array[j+1]) {
//互换元素位置
temp = array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
System.out.println("第"+(i+1)+"轮排序的结果是"+ Arrays.toString(array));
}
return;
}
}
结果输出
第1轮排序的结果是[3, 5, 7, 1, 9]
第2轮排序的结果是[3, 5, 1, 7, 9]
第3轮排序的结果是[3, 1, 5, 7, 9]
第4轮排序的结果是[1, 3, 5, 7, 9]
Process finished with exit code 0
代码优化
根据上述算法发现对于长度为n的数组需要进行n-1轮排序才能算出最终的结果,但是并非所有数组都需要n-1次才能等要最终的排序结果,比如{1,2,3,5,4}我们发现这个数组只需经过一次排序就能得到结果,那么如何对上面的代码进行优化呢?只需判断一轮排序下来有无出现元素互换位置就可以确定是否完成了排序。如果经过一轮排序元素位置没有发生互换说明排序已经完成
public class bubblePlus {
public static void main(String[] args) {
int[] array = {1,2,3,5,4};
bubboSort(array);
}
/**
*冒泡排序
*/
public static void bubboSort(int[] array){
int temp;
//判断是否有元素进行交换
boolean flag = false;
for (int i = 0; i < array.length-1; i++) {
if(array==null || array.length < 2 ){
return;
}
//每进行一次排序后参与比较的数量减一
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j]>array[j+1]) {
//位置交换就改为true
flag = true;
temp = array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
if (!flag){
//位置没有发生交换说明排序已经完成
break;
}else{
//位置发生改变需要将flag重新置为false以便于下一轮的判断
System.out.println("第"+(i+1)+"轮排序的结果是"+ Arrays.toString(array));
flag = false;
}
}
return;
}
}
优化后的结果输出
第1轮排序的结果是[1, 2, 3, 4, 5]
Process finished with exit code 0
来源:https://blog.csdn.net/m0_60117382/article/details/122017801


猜你喜欢
- 内容:1、滑动优化(滑动时不加载图片,停止才加载)2、第一次进入时手动加载代码如下:1、界面布局<?xml version="
- 什么是程序集?1.程序集(assembly)是一个及一个以上托管模块,以及一些资源文件的逻辑组合。2.程序集是组件复用,以及实施安全策略和版
- 前言在Web应用开发过程中,一般都涵盖一些常用功能的实现,如数据库访问、异常处理、消息队列、缓存服务、OSS服务,以及接口日志配置,接口文档
- 目录界面布局分析ListView 简介编码实现用到的组件结语:界面布局分析本篇要实现的列表如上图所示。我们拿到界面设计稿之后,在 UI 开发
- HashMap 概述HashMap 是通过 put(key,value) 存储,get(key)来获取。当传入 key 时,HashMap
- Android 和 H5 都是移动开发应用的非常广泛。市面上很多App都是使用Android开发的,但使用Android来开发一些比较复杂附
- 问题现象今天使用mybatis遇到个很奇怪的问题,我使用一个参数@param("threshold"),类型是java的
- equalsIgnoreCase() 方法用于将字符串与指定的对象比较,不考虑大小写。实例equals() 会判断大小写区别,equalsI
- 需求某航空公司物流单信息查询,是一个post请求。通过后台模拟POST HTTP请求发现无法获取页面数据,通过查看航空公司网站后,发现网站使
- 现在很多网站都有注册登录的页面,为了更好的满足用户体验和网站的安全性,很多网站都采用动态生成的图形码或者是附加码进行验证,下面把生成验证码的
- 首先,我们假设这样一个场景:一个ViewPager里面嵌套一个ViewPager,内部滑动方向和外部滑动方向一样时,该怎么解决这一冲突呢?针
- 本文列举了几个方法: 1. 使用java.math.BigDecimal &n
- MyBatis全局配置文件MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(propertie
- 本文实例为大家分享了Java实现简单抽牌游戏的具体代码,供大家参考,具体内容如下Main类package com.company;impor
- JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。同X
- 在一些需要经常更新页面数据的网站中,一般访问量不是很大的都直接发布的是带后台代码,每次访问都是有数据库交互的。但是一旦访问量增加了,那么这些
- 实践过程😜富文本芝麻粒儿提醒:标签是成对出现的就不要省略,有的不是成对的在修改了后就恢复过来,如下方alpha示例,否则多了很容易出现意外的
- 在Android程序中很多客户端软件和浏览器软件都喜欢用Tab分页标签来搭建界面框架。读者也许会马上想到使用TabHost 与 TabAct
- 本文实例为大家分享了SpringMVC实现文件上传和下载的具体代码,供大家参考,具体内容如下文件上传第一步,加入jar包:commons-f
- 数据库中记录了商家在百度标注的经纬度(如:116.412007, 39.947545)最初想法,以圆心点为中心点,对半径做循环,半径每增加一