一、算法原理

比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
二、实现思路
用二重循环实现,外循环变量设为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简单冒泡排序示例解析
# 数据交换
# 这一
# 第一个
# 在这
# 没有任何
# 只需
# 设为
# 所需
# 第二个
# 二个
# 依次为
# 越少
# 过程中
# 都是
# 是一个
# 对越
# 也有
# 有可能
# 遍历
# 将其
相关文章:
如何批量查询域名的建站时间记录?
如何快速搭建FTP站点实现文件共享?
专业商城网站制作公司有哪些,pi商城官网是哪个?
独立制作一个网站多少钱,建立网站需要花多少钱?
如何设计高效校园网站?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
如何在Golang中引入测试模块_Golang测试包导入与使用实践
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
建站之家VIP精选网站模板与SEO优化教程整合指南
如何解决ASP生成WAP建站中文乱码问题?
定制建站策划方案_专业建站与网站建设方案一站式指南
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
ui设计制作网站有哪些,手机UI设计网址吗?
网站制作公司排行榜,抖音怎样做个人官方网站
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
动图在线制作网站有哪些,滑动动图图集怎么做?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
高防服务器租用指南:配置选择与快速部署攻略
建站主机空间推荐 高性价比配置与快速部署方案解析
建站之星导航菜单设置与功能模块配置全攻略
网站制作公司,橙子建站是合法的吗?
如何在服务器上配置二级域名建站?
制作网站的公司有哪些,做一个公司网站要多少钱?
公司网站设计制作厂家,怎么创建自己的一个网站?
建站之星与建站宝盒如何选择最佳方案?
广东企业建站网站优化与SEO营销核心策略指南
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
建站之星如何优化SEO以实现高效排名?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
自助网站制作软件,个人如何自助建网站?
,如何利用word制作宣传手册?
建站三合一如何选?哪家性价比更高?
如何通过二级域名建站提升品牌影响力?
如何用好域名打造高点击率的自主建站?
创业网站制作流程,创业网站可靠吗?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
如何在建站宝盒中设置产品搜索功能?
制作网页的网站有哪些,电脑上怎么做网页?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
如何在阿里云完成域名注册与建站?
,想在网上投简历,哪几个网站比较好?
建站之星后台密码遗忘或太弱?如何重置与强化?
建站之星如何助力企业快速打造五合一网站?
安云自助建站系统如何快速提升SEO排名?
建站之星2.7模板快速切换与批量管理功能操作指南
宝塔建站教程:一键部署配置流程与SEO优化实战指南
金*站制作公司有哪些,金华教育集团官网?
*请认真填写需求信息,我们会在24小时内与您取得联系。