网站首页 > java教程 正文
概要
冒泡排序算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。冒泡排序是八大排序中的入门级排序算法,也是算法入门中比较经典的排序算法。本篇系统介绍下冒泡排序的原理以及实现。
原理
循环对比数组中前后相邻的两个元素,将较大的数交换移动到后面,一趟排序之后最大的数会被移动到最末尾。然后排除最末尾最大数,继续循环将最大数移动到末尾,最终保证数组有序。
一趟排序
以数组int n[] = { 6, 5, 2, 7, 1 }为例:
- 第一次6和5对比,较大的数字6与5交换;
- 第二次6和2对比,较大的数字6继续与2交换;
- 第三次6和7对比,较大的数字7无需交换;
- 第四次7和1对比,较大的数字7和1交换;
一趟排序后数组中最大的数字7位于数组末位
多趟排序控制
一趟排序后最大数字位与末位,通过控制数组下标大小,每次循环将需要排序数组个数减小一个,从而使得一趟排序后剔除当前最大元素后,继续对比交换依次将最大数字移动至末位:
- 第一趟排序将最大数字7移动至末位;
- 第二趟排序将7之前最大数字6移动至倒数第2位;
- 第三趟排序将6之前最大数字5移动至倒数第3位;
- 第四趟排序将5之前最大数字2移动至倒数第4位(第2位);
编码实践
public class Test {
public static void main(String[] args) {
int n1[] = { 6, 5, 2, 7, 1 };
bubbleSort1(n1);
System.out.print("冒泡排序方法一结果:");
for (int m : n1) {
System.out.print(m + " ");
}
System.out.println("");
int n2[] = { 6, 5, 2, 7, 1 };
bubbleSort1(n2);
System.out.print("冒泡排序方法二结果:");
for (int m : n2) {
System.out.print(m + " ");
}
System.out.println("");
int n3[] = { 6, 5, 2, 7, 1 };
bubbleSort1(n3);
System.out.print("冒泡排序方法三结果:");
for (int m : n3) {
System.out.print(m + " ");
}
}
public static void bubbleSort1(int n[]) {
for (int i = n.length - 1; i >= 0; i--) {
for (int j = 0; j < i; j++) {
if (n[j] > n[j + 1]) {
int temp = n[j];
n[j] = n[j + 1];
n[j + 1] = temp;
}
}
}
}
public static void bubbleSort2(int n[]) {
for (int i = n.length - 1; i >= 0; i--) {
for (int j = 0; j < i; j++) {
if (n[j] > n[j + 1]) {
n[j] ^= n[j + 1];
n[j + 1] ^= n[j];
n[j] ^= n[j + 1];
}
}
}
}
public static void bubbleSort3(int n[]) {
boolean isSort = false;
for (int i = n.length - 1; i >= 0 && !isSort; i--) {
isSort = true;
for (int j = 0; j < i; j++) {
if (n[j] > n[j + 1]) {
n[j] ^= n[j + 1];
n[j + 1] ^= n[j];
n[j] ^= n[j + 1];
isSort = false;
}
}
}
}
}
- 结果
冒泡排序方法一结果:1 2 5 6 7
冒泡排序方法二结果:1 2 5 6 7
冒泡排序方法三结果:1 2 5 6 7
说明
上述三种冒泡排序的编码实践方法中,第一种是冒泡排序最基础的写法;第二种使用位运算优化交换数字的效率;第三方法,利用标记位判定数组是否已经有序从而避免对有序数组的遍历进一步优化效率。
彩蛋
方法二bubbleSort2中交换数字使用的位运算:
n[j] ^= n[j + 1];
n[j + 1] ^= n[j];
n[j] ^= n[j + 1];
交换的原理是?这便是本篇的彩蛋。
结语
冒泡排序是最简单的排序算法之一,本篇重点介绍冒泡排序算法思想原理以及实现。进一步又介绍了冒泡的优化小技巧,理解本篇后相信日后再遇见手写冒泡排序的场景会更加得心应手,学无止境。最后,如果觉得本篇对你有所启发或帮助,不妨关注走一波0.0
猜你喜欢
- 2024-09-25 Java数组的排序冒泡排序选择排序二种冒泡逆排序
- 2024-09-25 java冒泡排序(Java冒泡排序算法)
- 2024-09-25 好程序员Java学习路线分享冒泡排序及优化
- 2024-09-25 五分钟学会一个初级算法:冒泡排序
- 2024-09-25 Java冒泡排序-大白话解释(java冒泡排序的方法代码)
- 2024-09-25 C#基础语法循环篇:冒泡排序算法讲解(附源码)
- 2024-09-25 排序算法之冒泡排序(冒泡排序 算法)
- 2024-09-25 经典排序算法之——冒泡排序(冒泡排序算法实例)
- 2024-09-25 Java十大排序算法之冒泡排序(java冒泡排序和快速排序)
- 2024-09-25 JAVA手写算法 | 冒泡排序算法(java简单冒泡排序写法)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)