java-冒泡排序 3

### 15. 综合示例

为了全面展示冒泡排序的各种实现和优化,我们可以编写一个综合示例,包含基本冒泡排序、优化版冒泡排序和鸡尾酒排序。

```java
public class ComprehensiveBubbleSort {

    // 基本冒泡排序
    public static void basicBubbleSort(int[] array) {
        int n = array.length;
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1 - i; j++) {
                if (array[j] > array[j + 1]) {
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
    }

    // 优化版冒泡排序
    public static void optimizedBubbleSort(int[] array) {
        int n = array.length;
        boolean swapped;
        for (int i = 0; i < n - 1; i++) {
            swapped = false;
            for (int j = 0; j < n - 1 - i; j++) {
                if (array[j] > array[j + 1]) {
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    swapped = true;
                }
            }
            if (!swapped) break;
        }
    }

    // 鸡尾酒排序
    public static void cocktailShakerSort(int[] array) {
        boolean swapped;
        int start = 0;
        int end = array.length;

        do {
            swapped = false;
            for (int i = start; i < end - 1; i++) {
                if (array[i] > array[i + 1]) {
                    int temp = array[i];
                    array[i] = array[i + 1];
                    array[i + 1] = temp;
                    swapped = true;
                }
            }
            if (!swapped) break;

            end--;

            swapped = false;
            for (int i = end - 1; i >= start; i--) {
                if (array[i] > array[i + 1]) {
                    int temp = array[i];
                    array[i] = array[i + 1];
                    array[i + 1] = temp;
                    swapped = true;
                }
            }
            start++;
        } while (swapped);
    }

    public static void main(String[] args) {
        int[] array = {5, 3, 8, 4, 2};

        // 使用基本冒泡排序
        basicBubbleSort(array.clone());
        System.out.println("Basic Bubble Sort:");
        printArray(array);

        // 使用优化版冒泡排序

```java
        int[] optimizedArray = {5, 3, 8, 4, 2};
        optimizedBubbleSort(optimizedArray);
        System.out.println("Optimized Bubble Sort:");
        printArray(optimizedArray);

        // 使用鸡尾酒排序
        int[] cocktailArray = {5, 3, 8, 4, 2};
        cocktailShakerSort(cocktailArray);
        System.out.println("Cocktail Shaker Sort:");
        printArray(cocktailArray);
    }

    // 打印数组
    public static void printArray(int[] array) {
        for (int i : array) {
            System.out.print(i + " ");
        }
        System.out.println();
    }
}
```

在这个综合示例中,我们定义了三个排序方法:基本冒泡排序、优化版冒泡排序和鸡尾酒排序。然后在`main`方法中分别调用这些排序方法,并打印排序后的数组。

### 16. 冒泡排序的详细步骤和解释

为了更好地理解冒泡排序,下面详细解释每一步的实现和优化方法:

#### 16.1 基本冒泡排序

基本冒泡排序通过两个嵌套的`for`循环实现:

- 外层循环`for (int i = 0; i < n - 1; i++)`控制遍历的次数。每次遍历后,最大的元素会被移动到数组的末尾,因此内层循环的范围逐渐减小。
- 内层循环`for (int j = 0; j < n - 1 - i; j++)`用于比较和交换相邻的元素。如果前一个元素大于后一个元素,则交换它们。

#### 16.2 优化版冒泡排序

优化版冒泡排序在基本冒泡排序的基础上增加了一个`swapped`标志:

- 每次内层循环开始前,将`swapped`设置为`false`。
- 如果发生了交换操作,则将`swapped`设置为`true`。
- 如果一次完整的内层循环后,`swapped`仍然为`false`,说明数组已经有序,可以提前终止排序过程。

#### 16.3 鸡尾酒排序

鸡尾酒排序是冒泡排序的双向版本,通过两个方向的遍历来提高排序效率:

- 定义`start`和`end`两个变量,分别表示未排序部分的起始和结束位置。
- 在每次遍历中,先从左到右进行冒泡排序,将最大的元素移动到末尾,然后从右到左进行冒泡排序,将最小的元素移动到开头。
- 每次遍历结束后,调整`start`和`end`的值,缩小未排序部分的范围。

### 17. 冒泡排序的代码优化和可读性提高

为了提高代码的可读性和可维护性,可以将常见操作封装为函数,并添加注释说明。

```java
public class EnhancedBubbleSort {

    // 基本冒泡排序
    public static void basicBubbleSort(int[] array) {
        int n = array.length;
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1 - i; j++) {
                if (array[j] > array[j + 1]) {
                    swap(array, j, j + 1);
                }
            }
        }
    }

    // 优化版冒泡排序
    public static void optimizedBubbleSort(int[] array) {
        int n = array.length;
        boolean swapped;
        for (int i = 0; i < n - 1; i++) {
            swapped = false;
            for (int j = 0; j < n - 1 - i; j++) {
                if (array[j] > array[j + 1]) {
                    swap(array, j, j + 1);
                    swapped = true;
                }
            }
            if (!swapped) break;
        }
    }

    // 鸡尾酒排序
    public static void cocktailShakerSort(int[] array) {
        boolean swapped;
        int start = 0;
        int end = array.length;

        do {
            swapped = false;
            for (int i = start; i < end - 1; i++) {
                if (array[i] > array[i + 1]) {
                    swap(array, i, i + 1);
                    swapped = true;
                }
            }
            if (!swapped) break;

            end--;

            swapped = false;
            for (int i = end - 1; i >= start; i--) {
                if (array[i] > array[i + 1]) {
                    swap(array, i, i + 1);
                    swapped = true;
                }
            }
            start++;
        } while (swapped);
    }

    // 交换数组中的两个元素
    private static void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    public static void main(String[] args) {
        int[] array = {5, 3, 8, 4, 2};

        // 使用基本冒泡排序
        int[] basicArray = array.clone();
        basicBubbleSort(basicArray);
        System.out.println("Basic Bubble Sort:");
        printArray(basicArray);

        // 使用优化版冒泡排序
        int[] optimizedArray = array.clone();
        optimizedBubbleSort(optimizedArray);
        System.out.println("Optimized Bubble Sort:");
        printArray(optimizedArray);

        // 使用鸡尾酒排序
        int[] cocktailArray = array.clone();
        cocktailShakerSort(cocktailArray);
        System.out.println("Cocktail Shaker Sort:");
        printArray(cocktailArray);
    }

    // 打印数组
    public static void printArray(int[] array) {
        for (int i : array) {
            System.out.print(i + " ");
        }
        System.out.println();
    }
}
```

在这个优化后的代码中,我们将交换元素的操作封装到`swap`方法中,减少代码重复,并通过注释提高代码的可读性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/35002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

考研数学(3/9):一元函数积分学

目录 一元函数积分学 1. 不定积分 1.1 不定积分的定义 1.2 不定积分的性质 1.3 不定积分的计算方法 2. 定积分 2.1 定积分的定义 2.2 定积分的性质 2.3 定积分的计算方法 3. 定积分的应用 3.1 求平面图形的面积 3.2 求旋转体的体积 3.3 求曲线的弧长 3.4 求曲面的…

【数据建模】微分方程与动力系统

文章目录 微分方程与动力系统1. 微分方程的理论基础1.1 函数、导数与微分1.2 一阶线性微分方程的解1.3 二阶常系数线性微分方程的解 2. 使用python求解微分方程2.1 求解微分2.2 求解定积分2.2.1 quad函数求解2.2.2 梯型法则求解 3. 使用Scipy和Sympy解微分方程3.1 使用sympy求解…

MATLAB中findall用法

目录 语法 说明 示例 查找具有可见或隐藏句柄的图窗 查找句柄处于隐藏状态的对象 查找 Text 对象 提示 findall的功能是查找所有图形对象。 语法 h findall(objhandles) h findall(objhandles,prop1,value1,...,propN,valueN) 说明 h findall(objhandles) 返回 ob…

VUE JS 将html转成pdf 例子

在Vue.js中生成PDF文件&#xff0c;可以使用html2canvas和jspdf库。 安装依赖库 npm install html2canvas jspdf在Vue组件中使用 <template><div><button click"generatePDF">生成PDF</button></div> </template><script&…

ubuntu22.04 设置双屏

一 概述 最近把ubuntu18.04 升级到 22.04 双屏显示出来问题&#xff0c;在此记录下解决问题方案。二 解决方案 1 使用命令查看能检测到显示器 xrandr根据输出的信息&#xff0c;我们可以知道 HDMI-0 与 DP-0 是connected 。检测到两个显示器 2 设置输出显示器分辨率 由于我…

关于Vite+Vue+Ts WebStorm路径别名的问题

一、准备一个项目 二、在 vite.config.js 中添加 resolve: {alias: {: /src}} 三、tsconfig.app.json中添加代码 //添加代码"baseUrl": ".","paths": {"/*": ["src/*"]}把src的一个文件修改路径为开头 四、安装插件 npm i …

来给大家推荐得10个有效磁力导航链接(好用搜资料找资源)

都2024现在网上找资源像流水得鱼一样&#xff0c;抓一大把结果很难吃&#xff0c;我通宵特意整理的网站&#xff0c;网上有许多磁力导航网站可以提供海量的磁力链接资源&#xff0c;以下是一些有效的磁力导航网站推荐&#xff1a; 磁力搜索 网站地址&#xff1a;www.chiliso…

安装软件时出现风险警告——代码签名证书帮您解决(申请与优惠)

您开发的软件在用户下载安装时是否有以下弹窗提醒&#xff1f; 如何让用户信任软件并下载软件&#xff0c;是众多软件开发公司需要迫切去解决的问题&#xff0c;由此代码签名证书应运而生。 一 什么是代码签名证书 代码签名证书是一种提供给软件开发者&#xff0c;对其开发的…

上下文管理器在Python中的妙用

更多Python学习内容&#xff1a;ipengtao.com Python上下文管理器是一个非常强大的工具&#xff0c;它能够帮助开发者在特定代码块前后自动执行特定的操作&#xff0c;常用于资源管理&#xff0c;如文件操作、数据库连接和锁定等。本文将详细介绍Python上下文管理器的概念、使用…

【C++】final关键字 | 避免派生、重写

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

AWS云计算平台:全方位服务与实践案例

摘要 在数字化浪潮的推动下&#xff0c;云计算已成为企业转型的强大引擎。AWS作为云计算的先锋&#xff0c;不仅提供了一系列强大的基础设施服务&#xff0c;更是在人工智能领域不断探索和创新。本文将带您领略AWS的全方位服务&#xff0c;并透过实际案例&#xff0c;感受其在…

注解详解系列 - @ConditionalOnProperty:基于属性的条件配置

注解简介 在今天的注解详解系列中&#xff0c;我们将探讨ConditionalOnProperty注解。ConditionalOnProperty是Spring Boot提供的一个注解&#xff0c;用于基于配置属性的值来有条件地包含或排除Bean定义。通过ConditionalOnProperty注解&#xff0c;可以根据外部配置文件中的…

最新MDYS14源码影视视频网站模板/苹果CMS系统/附搭建教程

最新MDYS14源码影视视频网站模板/苹果CMS系统/附搭建教程 基本介绍&#xff1a; 1、后台增加自定义参数&#xff0c;对应会员升级页面&#xff0c;以及积分充值 2、视频&#xff0c;演员&#xff0c;专题&#xff0c;收藏&#xff0c;会员系统模块齐全&#xff0c;支持子分类…

发包真香之:scapy工具

scapy – python 可自由组包 参考学习&#xff1a;初识Scapy–Python的Scapy/Kamene模块学习之路 scapy 介绍 Scapy是基于Python语言的网络报文处理程序&#xff0c;它可以让用户发送、嗅探、解析、以及伪造网络报文&#xff0c;运用Scapy可以进行网路侦测、端口扫描、路由追…

已解决java.beans.IntrospectionException: 在Java Beans中内省过程失败的正确解决方法,亲测有效!!!

已解决java.beans.IntrospectionException: 在Java Beans中内省过程失败的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 检查命名规范 验证Getter/Setter匹配性 确认访问权限 审查类型一致性 简…

常见概念之压力测试

简介 压力测试(Stress Testing)通常包含以下几个主要内容: 负载测试(Load Testing) 模拟大量并发用户访问系统,测试系统在高负载下的表现。关注系统的响应时间、吞吐量、资源利用率等指标。确定系统的最大承载能力。 容量测试(Capacity Testing) 测试系统在超出正常预期负…

Android网络基础面试题之HTTPS的工作流程和原理

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 工作流程 HTTPS 默认工作在 TCP 协议443端口&#xff0c;它的工作流程一般如以下方式&#xff1a; 1、TCP 三次同步握手 2、客户端验证服务器…

SpringMVC 请求参数接收

目录 请求 传递单个参数 基本类型参数传递 未传递参数 传递参数类型不匹配 传递多个参数 传递对象 后端参数重命名 传递数组 传递集合 传递JSON数据 JSON是什么 JSON的优点 传递JSON对象 获取URL中的参数 文件上传 在浏览器与程序进行交互时&#xff0c;主要分为…

智能语音机器人代替辅助人工电销是发展的必然,语音识别

智能语音机器人电销是从2016年之后开始出现在电销市场上&#xff0c;并且迅速被众多电销企业所认可使用。那究竟什么是智能语音机器人呢!字面理解就是利用智能语音机器人去做人工电销员该做的工作&#xff0c;完成人工电销员需要完成的任务。事实上智能语音机器人也就是字面上理…

字节豆包 MarsCode:AI 开发工具

MarsCode 是豆包旗下的智能编程助手&#xff0c;类似 GitHub Copilot 提供以智能代码补全为代表的核心能力&#xff0c;简单试用了下&#xff0c;免费&#xff0c;使用时需要手机号登录&#xff0c;代码补全还算 ok&#xff0c;聊天功能就有点差了。 还包括一个 AI 原生 IDE&am…