冒泡算法的规则:

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放待排序序列的起始位置(或末尾位置),直到全部待排序的数据元素排完

动态图:

对应代码

static void swap(int[] arr, int addr1, int addr2) { //数组数据交换
if (addr1 == addr2) {
return;
}
arr[addr1] = arr[addr1] ^ arr[addr2];
arr[addr2] = arr[addr1] ^ arr[addr2];
arr[addr1] = arr[addr1] ^ arr[addr2];
}
    static void bubbleSort(int[] arr) { // 单向冒泡
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] < arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
}
    static void bubbleSortOpt(int[] arr) { // 单向冒泡 + 有序后面无需冒泡
for (int i = 0; i < arr.length; i++) {
int flag = 0;
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] < arr[j + 1]) {
swap(arr, j, j + 1);
flag = 1;
}
}
if (flag == 0) {
return;
}
}
}
    static void bubbleSortOpt1(int[] arr) {  // 单向冒泡 + 有序后面无需冒泡 + 部分有序部分无需冒泡
int pos = 0;
int end = arr.length - 1;
for (int i = 0; i < arr.length; i++) {
int flag = 0;
for (int j = 0; j < end; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
pos = j;
flag = 1;
}
}
end = pos;
}
}
    static void bubbleSortOpt2(int[] arr) { // 双向冒泡 + 有序后面无需冒泡 + 部分有序部分无需冒泡
int start = 0;
int end = arr.length - 1;
int low = start;
int high = end; for (int i = 0; i < arr.length; i++) {
int flag = 0;
for (int j = start; j < end; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
high = j;
flag = 1;
}
}
end = high;
for (int j = end; j > start; j--) {
if (arr[j] < arr[j - 1]) {
swap(arr, j, j - 1);
low = j;
flag = 1;
}
}
start = low;
if (flag == 0) {
return;
}
}
}
    public static void main(String[] args) {  // 主函数测试
int[] arr = new int[] { 21, 44, 77, 1, 6, 99 }; System.out.println(Arrays.toString(arr));
bubbleSortOpt2(arr);
System.out.println(Arrays.toString(arr));
}

感觉这个东西直接记住双向冒泡就可以了,毕竟是最优化的冒泡算法

冒泡算法及其优化(java)的更多相关文章

  1. java的两种冒泡算法

    所谓的冒泡算法,就是给数组进行排序,可以根据以小到大的顺序,也可以根据以小到大的顺序,在数组的封装类java.util.Arrays通过sort方法进行按升序的排序.那不用类的话怎么进行呢? 思路一: ...

  2. 前端面试题解密:经典算法之冒泡算法(ES6版)及优化

    前言 随着前端的飞速发展,前端业务开发给前端工程师提出了更高的要求,因而算法题也越来越高频次的出现在前端面试中.有很多的小伙伴找胡哥苦诉,在前端实际开发中(除了涉及游戏开发方面),算法使用有很多吗?大 ...

  3. java数组及数组的插入,删除,冒泡算法

    1.数组的定义 数组为相同类型的若干个数据,在一个数组里面,不能存放多种不同类型的数据,其中每个数据为该数组的一个元素,可以通过下标对改元素进行访问. 1.1 数组的特点 (1)数组被创建后,长度就已 ...

  4. 排序算法总结(基于Java实现)

    前言 下面会讲到一些简单的排序算法(均基于java实现),并给出实现和效率分析. 使用的基类如下: 注意:抽象函数应为public的,我就不改代码了 public abstract class Sor ...

  5. 冒泡排序优化JAVA

    本文对传统的冒泡排序进行了一些优化,减少了循环次数. 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序.所需的关键字比较次数 C 和记录移动次数 M 均达到最小值: C(min)=n-1 , ...

  6. jvm系列(十):如何优化Java GC「译」

    本文由CrowHawk翻译,是Java GC调优的经典佳作. 本文翻译自Sangmin Lee发表在Cubrid上的"Become a Java GC Expert"系列文章的第三 ...

  7. 排序算法以及其java实现

    一.术语了解 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排序操作都在内存中完成: 外排序:由 ...

  8. python 内置函数,匿名函数,sorted,filter,map,递归,二分法,冒泡算法 eval

    ############################总结#################################1. lambda 匿名函数 语法——lambda 参数:返回值 __na ...

  9. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

随机推荐

  1. ThreadLocal使用全解

    一.何为ThreadLocal 1.ThreadLocal的含义 ThreadLocal,即线程变量,是一个以ThreadLocal对象为键,任意对象为值的存储结构.这个结构被附带在线程上,也就是说一 ...

  2. CF1462-F. The Treasure of The Segments

    题意: 给出n个线段组成的集合,第i个线段用 \(\{l_i, r_i\}\) 表示线段从坐标轴的点\(l_i\)横跨到点\(r_i\).现在你可以删除其中的一些线段,使得剩下的线段组成的集合中至少存 ...

  3. 深入了解typeof与instanceof的使用场景及注意事项

    JavaScript中的数据类型分为两类,undefined,number,boolean,string,symbol,bigint,null[1]组成的基础类型和Object.Function.Ar ...

  4. MySQL 字符集及校验规则

    字符集 Mysql 的字符集有4个级别的默认设置:服务器级,数据库级,表级和字段级,客户端交互时,也可以指定字符集 # 字符集:是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称,包括各国 ...

  5. 二进制安装kubernetes(三) kube-controller-manager组件安装

    Controller Manager简介 详细介绍请参考链接:Kubernetes组件之kube-controller-manager Controller Manager作为集群内部的管理控制中心, ...

  6. GUI编程

    组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事 破解工具 简介 GUI的核心技术:Swing AWT 界面不美观 需要jre环境 为了了解MVC架构 了解监听. AWT 包 ...

  7. iPhone 12 导入通讯录排序 Bug

    iPhone 12 导入通讯录排序 Bug iOS iOS 通讯录排序问题 Huawei OK solution iOS 切换中英文,修复排序通讯录 bug Awesome iOS Contacts ...

  8. npm-run-all

    npm-run-all npm scripts https://www.npmjs.com/package/npm-run-all A CLI tool to run multiple npm-scr ...

  9. iPadOS 14 memoji 无法使用 bug

    iPadOS 14 memoji 无法使用 bug iPadOS 14 bug refs 如何在 iPhone 和 iPad Pro 上使用动话表情 https://support.apple.com ...

  10. Techme INC解读基因魔剪,带来的是机遇还是风险?

    10月7日,诺贝尔化学奖颁给了法国美国生物学家Jennifer Doudna和生物化学家Emmanuelle Charpentier,以表彰她们对新一代基因技术CRISPR的贡献,全网沸腾. CRIS ...