冒泡算法的规则:

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

动态图:

对应代码

  1. static void swap(int[] arr, int addr1, int addr2) { //数组数据交换
  2. if (addr1 == addr2) {
  3. return;
  4. }
  5. arr[addr1] = arr[addr1] ^ arr[addr2];
  6. arr[addr2] = arr[addr1] ^ arr[addr2];
  7. arr[addr1] = arr[addr1] ^ arr[addr2];
  8. }
  1. static void bubbleSort(int[] arr) { // 单向冒泡
  2. for (int i = 0; i < arr.length; i++) {
  3. for (int j = 0; j < arr.length - i - 1; j++) {
  4. if (arr[j] < arr[j + 1]) {
  5. swap(arr, j, j + 1);
  6. }
  7. }
  8. }
  9. }
  1. static void bubbleSortOpt(int[] arr) { // 单向冒泡 + 有序后面无需冒泡
  2. for (int i = 0; i < arr.length; i++) {
  3. int flag = 0;
  4. for (int j = 0; j < arr.length - i - 1; j++) {
  5. if (arr[j] < arr[j + 1]) {
  6. swap(arr, j, j + 1);
  7. flag = 1;
  8. }
  9. }
  10. if (flag == 0) {
  11. return;
  12. }
  13. }
  14. }
  1. static void bubbleSortOpt1(int[] arr) { // 单向冒泡 + 有序后面无需冒泡 + 部分有序部分无需冒泡
  2. int pos = 0;
  3. int end = arr.length - 1;
  4. for (int i = 0; i < arr.length; i++) {
  5. int flag = 0;
  6. for (int j = 0; j < end; j++) {
  7. if (arr[j] > arr[j + 1]) {
  8. swap(arr, j, j + 1);
  9. pos = j;
  10. flag = 1;
  11. }
  12. }
  13. end = pos;
  14. }
  15. }
  1. static void bubbleSortOpt2(int[] arr) { // 双向冒泡 + 有序后面无需冒泡 + 部分有序部分无需冒泡
  2. int start = 0;
  3. int end = arr.length - 1;
  4. int low = start;
  5. int high = end;
  6.  
  7. for (int i = 0; i < arr.length; i++) {
  8. int flag = 0;
  9. for (int j = start; j < end; j++) {
  10. if (arr[j] > arr[j + 1]) {
  11. swap(arr, j, j + 1);
  12. high = j;
  13. flag = 1;
  14. }
  15. }
  16. end = high;
  17. for (int j = end; j > start; j--) {
  18. if (arr[j] < arr[j - 1]) {
  19. swap(arr, j, j - 1);
  20. low = j;
  21. flag = 1;
  22. }
  23. }
  24. start = low;
  25. if (flag == 0) {
  26. return;
  27. }
  28. }
  29. }
  1. public static void main(String[] args) { // 主函数测试
  2. int[] arr = new int[] { 21, 44, 77, 1, 6, 99 };
  3.  
  4. System.out.println(Arrays.toString(arr));
  5. bubbleSortOpt2(arr);
  6. System.out.println(Arrays.toString(arr));
  7. }

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

冒泡算法及其优化(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. CF1463-B. Find The Array

    题意: 给出一个由n个数组成的数组a,这个数组的元素和为S,要求你找出一个由n个数字组成数组b,这个数组满足: 数组中的每个数可以将他两边的数字整除或者被他两边的数字整除 数组b中每个位置的数字减去数 ...

  2. 操作系统 part3

    1.操作系统四特性 并发:一个时间段,多个进程在宏观上同时运行 共享:系统中的资源可以被多个并发进程共同使用(互斥共享,同时共享) 虚拟:利用多道程序设计,利用时分复用(分时系统)和空分复用(虚拟内存 ...

  3. sdut2878 环形依赖的DP(高斯消元,剪枝后的模板

    这题的状态是循环依赖的有环.. 之前一道概率DP,类似有环..但是它是可以消掉的 比如dp[i]=0.3*dp[i+1]+0.2*dp[i+2]+0.5*dp[i]; 完全可以变成,0.5*dp[i] ...

  4. Linux 驱动框架---驱动中的时间相关

    内核中的时间 Linux 系统内核对于时间的管理依赖于硬件,硬件按一定的周期产生中断,周期由内核的一个配置值HZ决定在系统启动时会将定时器配置为HZ值指定的频率产生中断:同时内核和维护一个64位(X8 ...

  5. Linux 驱动框架---input子系统框架

    前面从具体(Linux 驱动框架---input子系统)的工作过程学习了Linux的input子系统相关的架构知识,但是前面的学习比较实际缺少总结,所以今天就来总结一下输入子系统的架构分层,站到远处来 ...

  6. Self-publishing 自出版

    Self-publishing 自出版 出书 传统出版 在过去的几十年中,发布意味着要经过代理商和发布者. 自出版 如今,自助出版允许作者绕过出版商和书店,直接向公众出售. refs https:// ...

  7. 如何使用 js 检测控制台被用户打开了

    如何使用 js 检测控制台被用户打开了 js solutions 监听 F12 事件 监听键盘快捷键组合 Ctrl + Shift + I Option + Command + I Object.to ...

  8. layui 时间插件laydate中动态设置改变min和max值

    <div class="layui-inline"> <label class="layui-form-label">申请时间</ ...

  9. express+mongodb开发网站

    准备工作: 1安装git 进入官网  使用方法:使用git教程 2安装node.js 进入官网 3安装mongodb 进入官网 需要技术: 1.基础知识:html .css. js .jquery 2 ...

  10. NGK公链账本技术浅析

    NGK公链账本是一个去中心化加密账本,运行在分布式网络上.分布式账本是区块链技术中最重要的组成部分之一.NGK作为公链资产,在公链中起到桥梁作用,可以促进其他资产(法币.数字资产.股权以及实物资产)交 ...