经典算法题型之排序算法(三)

冒泡排序的第二种写法

第二种写法是在第一种写法的基础上改良而来的:

复制代码
public static void bubbleSort(int[] arr) {
    // 初始时 swapped 为 true,否则排序过程无法启动
    boolean swapped = true;
    for (int i = 0; i < arr.length - 1; i++) {
        // 如果没有发生过交换,说明剩余部分已经有序,排序完成
        if (!swapped) break;
        // 设置 swapped 为 false,如果发生交换,则将其置为 true
        swapped = false;
        for (int j = 0; j < arr.length - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                // 如果左边的数大于右边的数,则交换,保证右边的数字最大
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                // 表示发生了交换
                swapped = true;
            }
        }
    }
}

最外层的 for 循环每经过一轮,剩余数字中的最大值仍然是被移动到当前轮次的最后一位。这种写法相对于第一种写法的优点是:如果一轮比较中没有发生过交换,则立即停止排序,因为此时剩余数字一定已经有序了。

看下图演示:

图中可以看出:

  • 第一轮排序将数字 6 移动到最右边;
  • 第二轮排序将数字 5 移动到最右边,同时中途将 1 和 2 排了序;
  • 第三轮排序时,没有发生交换,表明排序已经完成,不再继续比较。
相关推荐
折哥的程序人生 · 物流技术专研7 小时前
Java 23 种设计模式:从踩坑到精通 | 备忘录模式 —— 快照与撤销,给对象装一个“后悔药”
java·设计模式·备忘录模式·行为型模式·java设计模式·从踩坑到精通·撤销重做
ysa0510307 小时前
【板子】欧拉序
c++·笔记·算法·深度优先·图论
ikun_文7 小时前
Java里面异常Exception体系知识点
java
不负岁月无痕7 小时前
STL -- C++ 红黑树封装 Map 和 Set
java·c语言·开发语言·c++·面试
大耳朵糊涂7 小时前
链表的基础操作(二)
算法
小园子的小菜7 小时前
Java核心基础:反射与泛型底层原理及实战用法详解
java·开发语言
拂拉氏7 小时前
【知识讲解】 红黑树的删除讲解
数据结构·算法·红黑树
初学者,亦行者7 小时前
算法设计与分析:动态规划 - TSP问题和0-1背包问题
c++·算法·动态规划
淘源码A7 小时前
多院区集团化云PACS系统源码,原生兼容国产软硬件环境
java·云计算·源码·saas·pacs·医学影像系统
何中应7 小时前
主流 OpenJDK 发行版下载安装
java·oracle·jdk·openjdk