java基础算法系列(二)冒泡排序的优化讲解(鸡尾酒算法)

简介: java基础算法系列(二)冒泡排序的优化讲解(鸡尾酒算法)

上一篇文章我们讲解了冒泡排序的简单优化,但是这个优化我们还是能发现问题,那就是我们只注意了到了从前往后进行冒泡排序,而从后往前排序也是可以的,那么我们可以来了解一下鸡尾酒排序。

鸡尾酒排序:

鸡尾酒排序又称双向冒泡排序、鸡尾酒搅拌排序、搅拌排序、涟漪排序、来回排序或快乐小时排序,鸡尾酒排序是冒泡排序的一种变形。该算法与一般的冒泡排序的不同处在于排序时是以双向在序列中进行排序。

其每一趟排序都可以将当前的最大值和最小值放置到正确的位置.传统的鸡尾酒排序 算法即使引入了标志是否交换的变量来记录前一趟数据是否发生交换从而确定排序是否结束,也无法处理前一趟排序有数据交换但是某些连续的数据存储子区间无交 换的情况.为了有效降低不必要的比较,引入了一种鸡尾酒排序算法的改进算法.

public static void main(String[] args) {
        int[] arr = { 1, 3, 4, 2, 6, 7, 8, 0, 5 };
        // 将最小值排到队尾
        long startTime = System.nanoTime(); // 获取开始时间
        for (int i = 0; i < arr.length / 2; i++) {
            for (int j = i; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            // 将最大值排到队头
            for (int j = arr.length - 1 - (i + 1); j > i; j--) {
                if (arr[j] < arr[j - 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = temp;
                }
            }
        }
        long endTime = System.nanoTime(); // 获取结束时间
        System.out.println("排序結果:" + Arrays.toString(arr));
        System.out.println("程序运行时间: " + (endTime - startTime) + "ns");
    }

打印结果

排序結果:[0, 1, 2, 3, 4, 5, 6, 7, 8]
程序运行时间:3600ns

那么我们上述鸡尾酒算法是否也能优化一下呢?我们来可以试试在左右起始位置定义一个索引,然后定义循环的方向,在每一个大循环中依次进行小循环,由于while循环比较好写,这里用了while循环。

改造后代码如下:

public static void main(String[] args) {
        int[] arr = { 1, 2, 4, 3, 6, 7, 8, 0, 5, 9 };
        int left = 0; // 左向循环起始位置
        int right = arr.length - 1; // 右向循环起始位置
        boolean leftToRight = true; // 循环方向
        long startTime = System.nanoTime(); // 获取开始时间
        while (left < right) {
            if (leftToRight) {
                // 从左到右,依次比较大小,排序完得到该趟排序右边最大值
                for (int i = left; i < right; i++) {
                    if (arr[i] > arr[i + 1]) {
                        arr[i] = arr[i] ^ arr[i + 1];
                        arr[i + 1] = arr[i] ^ arr[i + 1];
                        arr[i] = arr[i] ^ arr[i + 1];
                    }
                }
                right--;
                leftToRight = false;
            } else {
                // 从右到左,依次比较大小,排序完得到该趟排序左边最小值
                for (int j = right; j > left; j--) {
                    if (arr[j - 1] > arr[j]) {
                        arr[j - 1] = arr[j - 1] ^ arr[j];
                        arr[j] = arr[j - 1] ^ arr[j];
                        arr[j - 1] = arr[j - 1] ^ arr[j];
                    }
                }
                left++;
                leftToRight = true;
            }
        }
        long endTime = System.nanoTime(); // 获取结束时间
        System.out.println("排序結果:" + Arrays.toString(arr));
        System.out.println("程序运行时间: " + (endTime - startTime) + "ns");
    }

打印结果如下:

排序結果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
程序运行时间:2300ns

有人会说,上面的代码优化了吗,第一个鸡尾酒算法经过计算一共进入了12次循环,第二个则进入了11次,根据数据的不同而异。效率有些许的提升。

本章节是来自整理的java基础算法的第二节。你看完本系列文章,是不是感觉面试offer又能多2K!!


相关文章
|
10天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
32 6
|
12天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
12天前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
20天前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
25 4
|
18天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
23天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。
|
23天前
|
缓存 前端开发 JavaScript
9大高性能优化经验总结,Java高级岗必备技能,强烈建议收藏
关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。本文介绍了9种性能优化方法,涵盖代码优化、数据库优化、连接池调优、架构层面优化、分布式缓存、异步化、Web前端优化、服务化、硬件升级、搜索引擎和产品逻辑优化。欢迎留言交流。
|
22天前
|
存储 缓存 算法
优化轮询算法以提高资源分配的效率
【10月更文挑战第13天】通过以上这些优化措施,可以在一定程度上提高轮询算法的资源分配效率,使其更好地适应不同的应用场景和需求。但需要注意的是,优化策略的选择和实施需要根据具体情况进行详细的分析和评估,以确保优化效果的最大化。
|
22天前
|
存储 缓存 Java
Java应用瘦身记:Docker镜像从674MB优化至58MB的实践指南
【10月更文挑战第22天】 在容器化时代,Docker镜像的大小直接影响到应用的部署速度和运行效率。一个轻量级的Docker镜像可以减少存储成本、加快启动时间,并提高资源利用率。本文将分享如何将一个Java基础Docker镜像从674MB缩减到58MB的实践经验。
36 1
|
26天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。

热门文章

最新文章