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
猜你喜欢
- 本文主要和大家分享介绍了关于Java JDK * 使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:前言代理是一种常用的
- 为什么Android要申请权限简单说下在Android6.0及6.0以上一些google认为涉及“危险和用户隐私”的一些权限不仅要做清单文件
- 本文为大家分享了JAVA语言课程设计:连连看小游戏,供大家参考,具体内容如下1.设计内容界面中有5*10的界面,图中共有6种不同的图片,每两
- 摘要:这个问题算是老生常谈了,我也是一段时间没弄过了,所以感觉有些忘了,就记录一下。一、后端通过shiro在session中存储数据://
- 路由做Android/iOS原生开发的时候,要打开一个新的页面,你得知道你的目标页面对象,然后初始化一个Intent或者ViewContro
- 先看看效果Like This↓一、公共WiFi 公用电脑什么的在我们日常在线上工作、玩耍时,不论开电脑、登录淘宝、玩网游统统都会用到键盘输入
- 前言RefreshIndicator是Flutter里常见的下拉刷新组件,使用是比较方便的。但由于产品兄弟对其固定的刷新样式很是不满,而且代
- 1.引言在开发中,拖放是一种比较常见的手势操作,使用它能够让应用的交互更加地便捷和友好,本文将简要介绍如何为Android中的View添加拖
- ViewDragHelper是support.v4下提供的用于处理拖拽滑动的辅助类,查看Android的DrawerLayout源码,可以发
- 本文实例为大家分享了java实现简单单链表的具体代码,供大家参考,具体内容如下一、定义:单链表是一种链式存取的数据结构,用一组地址任意的存储
- 前言:封装、继承和多态是面向对象编程的三大特征。1.封装1.1.封装概念封装就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据
- 其他的不多说了!我们来看看效果吧 一、实现方式一:直接引入compile方式A
- 示例 1 :使用搜索表单创建全屏模式我们要构建的小应用程序有一个应用程序栏,右侧有一个搜索按钮。按下此按钮时,将出现一个全屏模式对话框。它不
- 官网教程一、翻转(镜像)头文件 quick_opencv.h:声明类与公共函数#pragma once#include <opencv
- 前言在我们平时使用图形化界面的时候,会发现来建立一个文件夹或者一个文档的时候很简单,只需要在桌面单击鼠标右键就可以了。但是,在我们写项目的时
- 建造者模式针对的是复杂对象的构建,比如一个产品有多个部分构成,每个部分都可以单独进行生产,这时候就可以用建造者模式,由Builder构造产品
- 在网站开发中经常遇到级联数据的展示,比如选择城市的时候弹出的省市县选择界面。很多前端制作人员习惯于从JSON中而不是从数据库中获
- 最近做一个需求,需求中的bean只用于生成一次json使用,所以想通过配置来动态的生成,查了一下,java还真有这个实现。java动态的生成
- 本篇实例内容是关于C#读取CAD文件的,直接看代码//在不使用任务插件的情况下读取DWG文件的缩略图,以便在没有安装AutoCAD的计算机上
- 初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂。今天本文就来